量词和后视问题

时间:2010-08-13 17:04:29

标签: ruby regex

### Ruby 1.8.7 ###

require 'rubygems'
require 'oniguruma' # for look-behind

Oniguruma::ORegexp.new('h(?=\w*)')
# => /h(?=\w*)/

Oniguruma::ORegexp.new('(?<=\w*)o')
# => ArgumentError: Oniguruma Error: invalid pattern in look-behind

Oniguruma::ORegexp.new('(?<=\w)o')
# => /(?<=\w)o/


### Ruby 1.9.2 rc-2 ###

"hello".match(/h(?=\w*)/)
# => #<MatchData "h">

"hello".match(/(?<=\w*)o/)
# => SyntaxError: (irb):3: invalid pattern in look-behind: /(?<=\w*)o/

"hello".match(/(?<=\w)o/)
# => #<MatchData "o"> 

我不能使用带有后视的量词吗?

2 个答案:

答案 0 :(得分:27)

问题是Ruby不支持可变长度的lookbehinds。量词不是本身,但它们不能使后视的长度不确定。

Perl具有相同的限制,就像所有以正则表达式为主的主要语言一样。

尝试使用简单的匹配(\w*)\W*?o而不是lookbehind。

答案 1 :(得分:5)

我正在敲打同样的问题,Borealid的答案帮助解释了这个问题。

然而,这让我思考。也许量词不需要在里面看后面,但可以应用于lookbehind 本身吗?

"hello".match(/(?<=\w*)o/)
# => SyntaxError: (irb):3: invalid pattern in look-behind: /(?<=\w*)o/

"hello".match(/(?<=\w)*o/)
# => #<MatchData "o">

所以现在我们有一个可变数量的恒定长度的lookbehinds。似乎为我绕过了这个问题。 :)