如何建立正则表达式匹配单词没有“”。“`

时间:2012-11-22 07:51:38

标签: ruby regex

假设我有一个这样的字符串:

w="abc#name,xy.abc=abc"

我想用另一个字符串替换第一个和第三个"abc"。我用了这段代码:

puts w.gsub(/\babc\b/,"replacer");
# => replacer#name,xy.replacer=replacer

第二个"abc"被替换,这不是我的预期。然后我改为以下模式:

puts w.gsub(/[^\.]\babc\b/,"replacer");
# => abc#name,xy.abcreplacer

其中第一个"abc"未被替换。我现在不知道如何解决它。

3 个答案:

答案 0 :(得分:2)

你可以尝试

/\b(?<!\.)abc\b/

但这是一个相当暴力的解决方案,带有负面的后视。

答案 1 :(得分:0)

与Tass类似,但使用负面预测

/\babc\b(?!=)/

答案 2 :(得分:0)

我会简化正则表达式并依靠gsub能够阻止:

target = 'abc'
replacement = 'foo'
'w="abc#name,xy.abc=abc"'.gsub(/#{ target }#|=#{ target }/) { |s| s.sub(target, replacement) }
=> "w=\"foo#name,xy.abc=foo\""

您想要的模式很简单:

<target>#
=<target>

找到那些,然后做一个简单的字符串替换。

这样做并不是将所有逻辑封装到正则表达式中,而是将其分解为两个单独的步骤,这简化了逻辑,加快了开发时间,并使代码更容易维护。

正则表达式是一个强大的工具,但有时你不需要复杂的气动锤,你需要一个小而简单的羊角锤和一个螺丝刀。