Подтвердить что ты не робот

Проблема с кванторами и взглядом

### 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"> 

Я не могу использовать кванторы с look-behind?

4b9b3361

Ответ 1

Проблема заключается в том, что Ruby не поддерживает lookbehind с переменной длиной. Квантификаторы не являются само по себе, но они не могут привести к тому, что длина lookbehind будет недетерминированной.

Perl имеет такое же ограничение, как и любой основной язык с регулярными выражениями.

Попробуйте использовать прямое соответствие (\w*)\W*?o вместо lookbehind.

Ответ 2

Я ударился головой о ту же проблему, и ответ Borealid помог хорошо объяснить проблему.

Однако это заставило меня задуматься. Может быть, квантификатор не должен находиться внутри lookbehind, но может быть применен к самому lookbehind?

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

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

Итак, теперь у нас есть переменное число постоянных lookbehind. Кажется, обойти эту проблему для меня.:)