使用 Ruby,我如何使用单个正则表达式来匹配“xy y ay xy +y”中所有出现的“y”,但前面没有 x (y, ay, +y)?
/[^x]y/ 也匹配前面的字符,所以我需要一个替代...
问问题
9828 次
5 回答
35
您需要一个零宽度的否定后视断言。试试/(?<!x)y/
哪个能准确说出您要查找的内容,即找到所有前面没有“x”的“y”,但不包括前面的字符,即零宽度部分。
编辑添加:显然这仅受 Ruby 1.9 及更高版本的支持。
于 2009-07-31T16:27:56.440 回答
3
在 Ruby 1.9 之前不支持负后视,但您可以使用扫描执行类似的操作:
"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"]
于 2009-07-31T16:51:23.960 回答
2
不幸的是,Ruby 不支持负向回溯,因此如果您需要查找多个字符,您将遇到麻烦。对于一个角色,您可以通过捕获匹配来解决这个问题:
/[^x](y)/
于 2009-07-31T16:29:32.537 回答
-1
在 PCRE 中,您使用否定的后视:
(:<!x)y
不确定 Ruby 是否支持这一点,但您可以随时查找。
于 2009-07-31T16:27:41.713 回答
-1
它可以用消极的目光来完成,(?<!x)y
于 2009-07-31T16:28:07.453 回答