正则表达式,多个gsub,/ 1和$ 1

时间:2016-05-10 16:15:50

标签: ruby regex

使用CodeWars中的正则表达式的示例。它应该找到单词并用俚语代替它们。

def gym_slang(phrase)
  phrase.gsub(/([pP])robably/, "\\1rolly")
    .gsub(/([iI])\sam/, "\\1'm")
    .gsub(/([Ii])nstagram/, "\\1nsta")
    .gsub(/([Dd])o\snot/, "\\1on't")
    .gsub(/([gG])oing to/, "\\1onna")
    .gsub(/([Cc])ombination/, "\\1ombo")
end
  1. 为什么这个例子中没有$1工作?我认为$1\1之间的差异是全局可用的第一个,而第二个仅在匹配和分组发生的方法中可用。
  2. 为什么我们需要逃避它两次?为什么不只是\1工作?
  3. 当我将gsub分开时,为什么该方法停止工作?它仅在我链接gsub方法时才有效。

1 个答案:

答案 0 :(得分:2)

  

为什么在这个例子中没有工作1美元(我试过)?

因为您使用gsub而没有阻止。参数在方法调用之前进行求值,因此如果将替换字符串作为参数给出,则无法在替换字符串中反映出正则表达式匹配。

  

为什么我们需要逃避两次?为什么只是\ 1不起作用?

因为"\1"评估为"\u0001",这是一个不同的角色。

  

为什么当我分开gsubs时方法停止工作?

因为如果你只是进行非破坏性的方法调用,gsub创建的字符串就会被抛弃。