我不知道正则表达式。我想学习正则表达式,但是仅仅为了正则表达式而学习正则表达式就很无聊。

我的第一个程序尝试结合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瓦图的深度!


评论

您尝试过LISP吗? ;-)

Ruby puts中的一件事与print相同,并且增加了新行。这简直是​​热闹。

@DanPantry:我想你的意思是“ WITHP”?

#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