Ruby 1.9 Regex Взгляд за утверждениями и якорями - PullRequest
1 голос
/ 03 августа 2010

Регулярное выражение 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 на случай, если оно было исправлено.

Ответы [ 3 ]

1 голос
/ 03 августа 2010

Похоже, что вы правы: \b работает так, как ожидалось, в прогнозе, но в прогнозе это рассматривается как синтаксическая ошибка.

В данном случае это не имеет значения: если бы (?<=^|\A|\s|\b) дало бы желаемый результат, то все равно вам нужно было бы \b. Символ, следующий за утверждением, должен быть s - символом слова, поэтому \b означает либо (1) предыдущий символ , а не символ слова, либо (2) там без предыдущего символа В таком случае ^, \A и \s являются избыточными.

Однако, если строка начинается с !, это другая история. ^ и \A по-прежнему соответствуют началу строки, до !, но \b соответствует после it. Если вы хотите сопоставить !substring! как полную строку, вы должны использовать /\A!substring!\Z/, но если вы хотите сопоставить только целое слово substring, вы должны использовать /\bsubstring\b/.

Что касается [^\B], то это просто соответствует любому символу, кроме B. Как и \b, \B является утверждением нулевой ширины, и класс символов должен соответствовать ровно одному символу. Некоторые разновидности регулярных выражений выдают исключение для недопустимой escape-последовательности \B, но Ruby (или Oniguruma, более вероятно) позволяет ему скользить.

0 голосов
/ 17 марта 2011

Да, выглядит как поддержка 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!" 
0 голосов
/ 03 августа 2010

Похоже, что интерпретация lookhehind - интерпретация диапазона [], а не группы (), как утверждения прогнозирования Возможно, это означает, что \ 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

Когда все остальное терпит неудачу ... используйте двойной минус!

...