0

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

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"没有被替换的地方。我现在不知道如何解决它。

4

3 回答 3

2

你可以试试

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

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

于 2012-11-22T07:58:10.693 回答
0

与 Tass 类似,但使用负前瞻

/\babc\b(?!=)/
于 2012-11-22T08:32:35.293 回答
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>

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

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

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

于 2012-11-22T15:48:45.447 回答