我有一个文件,其中包含" Canyon St / 27th Way"我试图变成" Canyon St和27th Way"使用Ruby正则表达式。
我使用file = file.gsub(/(\b) \/ (\b)/, "#{$1} and #{$2}")
来进行匹配,但我对于什么\ b真正意味着什么以及为什么$ 1包含在斜线之前的单词边界之前的所有字符以及为什么$ 2包含所有单词边界开始下一个单词后的字符。
通常,我希望正则表达式中括号中的任何内容都是1美元和2美元,但我不确定单词边界周围的括号是什么意思,因为从单词字符过渡到单词字符之间确实没有任何内容白色空间角色。
答案 0 :(得分:8)
括号在此上下文中没有做任何事情。您可以使用/\b \/ \b/
获得相同的结果。
我认为你会因$1
和$2
而感到困惑。那些实际上也没有做任何事情。它们是零,因为它们没有匹配(只是一个边界)。你所写的是.gsub(/\b \/ \b/, " and ")
答案 1 :(得分:6)
$ 1和$ 2实际上与你的正则表达式匹配无关:在调用方法之前评估方法的参数,所以
"#{$1} and #{$2}"
在正则表达式与字符串匹配之前进行评估。如果你还没有做过早期的正则表达式匹配,那么这些变量将为零,所以你实际上正在做
file = file.gsub(/(\b) \/ (\b)/, " and ")
那就是你用“和”替换空格包围的斜杠,也用空格包围。 $ 1和$ 2将更新为空字符串,因此当您处理下一个字符串时,您将看到相同的行为。
答案 2 :(得分:0)
\b - 在括号外匹配单词边界;括号内的退格 (0x08)
见https://ruby-doc.org/core-3.0.1/Regexp.html#class-Regexp-label-Anchors
There are three different positions that qualify as word boundaries:
1 和 2 的示例:
'island is'.gsub(/is/, 'IS') => "ISland IS"
'island is'.gsub(/\bis/, 'IS') => "ISland IS"
'island is'.gsub(/is\b/, 'IS') => "island IS"
'island is'.gsub(/\bis\b/, 'IS') => "island IS"
示例 3:
'this island is beautiful'.gsub(/is/, 'IS') => "thIS ISland IS beautiful"
'this island is beautiful'.gsub(/\bis/, 'IS') => "this ISland IS beautiful"
'this island is beautiful'.gsub(/is\b/, 'IS') => "thIS island IS beautiful"
'this island is beautiful'.gsub(/\bis\b/, 'IS') => "this island IS beautiful"
做你想做的最好的方法是简单的替换:
'Canyon St / 27th Way'.gsub(/\//,'and') => "Canyon St and 27th Way"
一种相当臃肿的方式包括捕获和引用:
'Canyon St / 27th Way'.gsub(/(.*) \/ (.*)/, "\\1 and \\2") => "Canyon St and 27th Way"