正则表达式匹配string1,除非前面是字符串2

时间:2009-07-31 16:23:09

标签: ruby regex string regex-negation

使用Ruby,如何使用单个正则表达式来匹配“xy y ay xy + y”中所有出现的'y',它们之前没有x(y,ay,+ y)?
/ [^ x] y /匹配前面的字符,所以我需要一个替代...

5 个答案:

答案 0 :(得分:34)

你需要一个零宽度负面的后置断言。尝试/(?<!x)y/,其中确切地说明了您要查找的内容,即查找所有'y'不在'x'之前,但不包括先前字符,即零宽度部分。

编辑添加:显然只支持Ruby 1.9及更高版本。

答案 1 :(得分:3)

在Ruby 1.9之前不支持负面监视,但你可以使用scan执行类似的操作:

"xy y ay xy +y".scan(/([^x])(y)/) # => [[" ", "y"], ["a", "y"], ["+", "y"]]
"xy y ay xy +y".scan(/([^x])(y)/).map {|match| match[1]}  # => ["y", "y", "y"]

当然,如果你想在y之前避免多于一个字符,这就困难得多。然后你必须做类似的事情:

"abby y crabby bally +y".scan(/(.*?)(y)/).reject {|str| str[0] =~ /ab/}  # => [[" ", "y"], [" ball", "y"], [" +", "y"]]
"abby y crabby bally +y".scan(/(.*?)(y)/).reject {|str| str[0] =~ /ab/}.map {|match| match[1]}  # => ["y", "y" "y"]

答案 2 :(得分:2)

Ruby不幸的是不支持负面的lookbehind,所以如果你需要查找多个字符,你就会遇到麻烦。对于一个角色,你可以通过捕捉匹配来解决这个问题:

/[^x](y)/

答案 3 :(得分:-1)

在PCRE中,你使用负面的后视:

(:<!x)y

不确定Ruby是否支持此功能,但您始终可以查找。

答案 4 :(得分:-1)

可以通过负面观察来完成,(?<!x)y