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