Проблема с квантификаторами и поиском - PullRequest
18 голосов
/ 13 августа 2010
### 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 ]

27 голосов
/ 13 августа 2010

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

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

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

5 голосов
/ 17 марта 2015

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

Однако, это заставило меня задуматься. Может быть, квантификатор не обязательно должен быть внутри вида сзади, но может применяться к самому виду сзади ? "hello".match(/(?<=\w*)o/) # => SyntaxError: (irb):3: invalid pattern in look-behind: /(?<=\w*)o/ "hello".match(/(?<=\w)*o/) # => #<MatchData "o"> Так что теперь у нас есть переменное количество постоянных взглядов. Кажется, чтобы обойти проблему для меня. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...