我的第一个程序尝试结合Daffy Duck的口齿和Elmer Fudd的言语失用症进行说话。
效果很好,但看起来很混乱已经。如何将Ruby和(重复的)正则表达式替换正确组合?句子。
用法:
What'th youw input? It's rabbit season!
What'th youw input? My super soaker carries 2 liters of water!
我的thupuh thoakuh cawwieth 2瓦图的深度!
#1 楼
通常,不好的做法是在多个遍中执行字符串替换,将一个替换的输出反馈到另一轮替换中。 (这是多次遍历替换如何导致错误结果的示例。)在这种情况下,由于没有一个输出与任何模式重叠,因此它很安全,但是我仍然建议使用其他方法。幸运的是,Ruby使#gsub(pattern, hash)
可以轻松地以正确的方式进行多个替换。自动返回最后一个求值表达式,所有内容都是一个表达式。标准是使用两个缩进空格,而不是三个。
评论
\ $ \ begingroup \ $
这三个空格缩进不是故意的,应该是四个。关于如何处理正则表达式的很好的建议,我想知道如何处理重叠的规则。明确的答案,我不知道这也行不通。
\ $ \ endgroup \ $
–桅杆
15年11月30日在21:46
\ $ \ begingroup \ $
太神奇了。我本来想提到潜在的重叠,但是我从未想到解决方案会如此简单。如果您保持简单且不太在意性能,则甚至可以从哈希构造正则表达式!
\ $ \ endgroup \ $
–雅各布·赖勒(Jacob Raihle)
15年11月30日在22:10
#2 楼
我的解决方案不是Ruby独有的-如果您有要替换的列表,请将其建模为列表(或array
),然后以您喜欢的方式遍历该列表: > def lisp(input)
substitutions = [
[/s/, "th"],
[/er/, "uh"],
[/r|l/, "w"]
]
substitution_helper(input.downcase, substitutions).capitalize
end
def substitution_helper(input, substitutions)
substitutions.inject(input) do |text, sub|
text.gsub(sub[0], sub[1])
end
end
puts lisp "it's Rabbit season"
这是wabbit theathon
评论
\ $ \ begingroup \ $
值得注意的是,某些语言(例如PHP)允许您将数组直接传递给函数,并会为您进行迭代。这样,也可以避免替换您已经替换的东西,以防万一您的正则表达式匹配重叠(例如[[/ a /,'e'],[/ e /,'i']])
\ $ \ endgroup \ $
–克服黑暗的绝对
15年11月30日在18:19
评论
您尝试过LISP吗? ;-)Ruby puts中的一件事与print相同,并且增加了新行。这简直是热闹。
@DanPantry:我想你的意思是“ WITHP”?