16

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

4

5 回答 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 回答