1

Ruby 1.9 正则表达式支持后向断言,但在模式中传递锚点时我似乎遇到了困难。当在前瞻断言中传递锚点时,它运行得很好。

"well substring! "[/(?<=^|\A|\s|\b)substring!(?=$|\Z|\s|\b)/] #=> RegexpError: invalid pattern in look-behind: /(?<=^|\A|\s|\b)substring(?=$|\Z|\s|\b)/

有谁知道如何使锚点在后向断言中像在前瞻中一样工作?

向后看是否需要特殊的转义序列或分组?

我已经在 1.9.1-p243、p376 和 1.9.2-preview3 中测试了这种行为,以防它被修补。

4

3 回答 3

1

看起来你是对的:\b在前瞻中按预期工作,但在后瞻中它被视为语法错误。

在这种情况下,这并不重要:如果(?<=^|\A|\s|\b)会产生预期的结果,\b那么无论如何都是您所需要的。断言后面的字符必须是--一个s单词字符--因此\b意​​味着(1)前一个字符不是单词字符,或者(2)没有前一个字符。既然如此^\A\s都是多余的。

但是,如果字符串以它开头,!那就另当别论了。 ^并且\A仍然匹配字符串的开头,在 ,之前!但在它之后\b匹配。如果你想匹配一个完整的字符串,你必须使用,但如果你只想匹配整个单词,你必须使用。!substring!/\A!substring!\Z/substring/\bsubstring\b/

至于[^\B],它只匹配除 之外的任何字符B。Like \b,\B是一个零宽度的断言,一个字符类必须匹配一个字符。一些正则表达式风格会为无效的转义序列抛出异常\B,但 Ruby(或 Oniguruma,更有可能)让它滑动。

于 2010-08-02T22:09:39.347 回答
0

看起来后向的解释是范围 [] 的解释,而不是像前瞻断言那样的组 ()。这可能意味着 \b 是无效的退格字符而不是单词边界。

"well substring! "[/(?<=^|\A|\s|[^\B])substring!(?=$|\Z|\s|\b)/]  #=> substring!
"well substring! "[/(?<=^|\A|\s|[^\B])substring(?=$|\Z|\s|\b)/]   #=> substring
"well !substring! "[/(?<=^|\A|\s|[^\B])substring(?=$|\Z|\s|\b)/]  #=> substring
"well !substring! "[/(?<=^|\A|\s|[^\B])!substring(?=$|\Z|\s|\b)/] #=> !substring

当所有其他方法都失败时......使用双重否定!

于 2010-08-02T20:40:17.693 回答
0

是的,看起来 Ruby 1.9.2 dosent 支持 \b 与后视。

ruby-1.9.2-p180 :034 > "See Jeffs book and it seems fine!".gsub(/(?=s\b)(?<=\bJeff)/,"'")
SyntaxError: (irb):34: invalid pattern in look-behind: /(?=s\b)(?<=\bJeff)/
from /home/pratikk/.rvm/rubies/ruby-1.9.2-p136/bin/irb:16:in `<main>'

ruby-1.9.2-p180 :033 > "See Jeffs book and it seems fine!".gsub(/(?=s\b)(?<=Jeff)/,"'")
 => "See Jeff's book and it seems fine!" 
于 2011-03-17T20:08:33.540 回答