假设我有一个这样的字符串:
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"
未被替换。我现在不知道如何解决它。
答案 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>
找到那些,然后做一个简单的字符串替换。
这样做并不是将所有逻辑封装到正则表达式中,而是将其分解为两个单独的步骤,这简化了逻辑,加快了开发时间,并使代码更容易维护。
正则表达式是一个强大的工具,但有时你不需要复杂的气动锤,你需要一个小而简单的羊角锤和一个螺丝刀。