Ruby1.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中测试了这个行为,以防它被打上补丁。
发布于 2010-08-03 06:09:39
看起来您是对的:\b在前视中按预期工作,但在后视中被视为语法错误。
在这种情况下,这并不重要:如果(?<=^|\A|\s|\b)能够产生所需的结果,那么\b就是您所需要的一切。断言后面的字符必须是s--一个单词字符--所以\b表示(1)前一个字符不是单词字符,或者(2)没有前一个字符。在这种情况下,^、\A和\s都是多余的。
但是,如果字符串以!开头,情况就不同了。^和\A仍然匹配字符串的开头,在!之前,但\b在它之后匹配。如果希望将!substring!作为一个完整的字符串进行匹配,则必须使用/\A!substring!\Z/,但是如果只希望匹配整个单词substring,则必须使用/\bsubstring\b/。
至于[^\B],它只匹配除B之外的任何字符。与\b类似,\B是一个零宽度断言,字符类必须恰好匹配一个字符。一些正则表达式风格可能会为无效的转义序列\B抛出异常,但是Ruby (或者更可能的是Oniguruma )会让它滑动。
发布于 2010-08-03 04:40:18
看起来对后视的解释是range [],而不是像前视断言那样的group ()。这可能意味着\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当一切都失败了..。使用双重否定!
发布于 2011-03-18 04:08:34
是的,看起来像Ruby 1.9.2不支持\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!" https://stackoverflow.com/questions/3391450
复制相似问题