字符串中整个单词的正则表达式,不以美元符号

时间:2016-02-29 10:14:52

标签: ruby regex

我想匹配不以$开头的子字符串。例如。 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'

1 个答案:

答案 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