我想匹配不以$
开头的子字符串。例如。 b a b
应匹配,但b $a b
不应该匹配。我尝试使用:
/\b(?![$])a\b/
/\b(?!\$)a\b/
/\b(?=[^$])a\b/
但所有匹配b $a b
。我知道我可以通过空格split
,并在每个元素上使用str.starts_with? '$'
,但我想知道为什么正则表达式不起作用。
编辑:我正在寻找正则表达式:
'b $a b' =~ <regex>
=> nil
'b a b' =~ <regex>
=> 2
将用于full_str.gsub(<regex>, 'c')
屈服:
'b a b'.gsub(<regex>, 'c')
=> 'b c b'
'b $a b'.gsub(<regex>, 'c')
=> 'b $a b'
'b a b $a b'.gsub(<regex>, 'c')
=> 'b c b $a b'
答案 0 :(得分:7)
您的\b(?![$])a\b
(和/\b(?!\$)a\b/
是一个等效表达式)与a
中的$a
匹配,因为该模式与任何用非单词字符括起的a
匹配或者字符串的开头/结尾不是$
(而a
不能是$
,因此前瞻在这里总是正确的。 \b(?=[^$])a\b
正则表达式再次匹配a
中的$a
,因为此表达式匹配任何a
作为整个单词(即用非单词字符或开头/结尾字符串括起来)不等于$
((?=[^$])
正向前瞻要求下一个字符不是$
,而a
不是$
,模式会返回a
中的$a
。
假设您要匹配前面没有a
的单词$
,请使用
'b a b' =~ /\b(?<!\$)a\b/
如果整个单词(?<!\$)
前面带有a
符号,那么负面后瞻$
将无法匹配。
请参阅Ruby demo:
puts 'b a b'.gsub(/\b(?<!\$)a\b/, "B") # b B b
puts 'b $a b'.gsub(/\b(?<!\$)a\b/, "B") # b $a b