使用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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top