正则表达式匹配string1,除非前面是字符串2
-
06-07-2019 - |
题
使用Ruby,如何使用单个正则表达式来匹配<!>中所有出现的'y'; xy y ay xy + y <!> quot;那些不是前面的x(y,ay,+ y)?
/ [^ x] y /匹配前面的字符,所以我需要一个替代...
解决方案
你需要一个零宽度负面的后置断言。尝试/(?<!x)y/
,其中确切地说明了您要查找的内容,即查找所有'y'不在'x'之前,但不包括前一个字符,即零宽度部分。
编辑添加:显然只支持Ruby 1.9及更高版本。
其他提示
在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"]
Ruby不幸的是不支持负面的lookbehind,所以如果你需要查找多个字符,你就会遇到麻烦。对于一个角色,你可以通过捕捉匹配来解决这个问题:
/[^x](y)/
在PCRE中,你使用负面的后视:
(:<!x)y
不确定Ruby是否支持此功能,但您始终可以查找。
可以通过负面观察来完成,(?<!x)y
不隶属于 StackOverflow