Делает ли Perl (5.8 и 5.10) какие-либо обещания относительно порядка чередования порядка? - PullRequest
2 голосов
/ 20 апреля 2009

При таком чередовании, как /(foo|foobar|foobaz)/, Perl 5.8 или 5.10 дает какие-либо обещания о том, какой из трех будет использоваться первым, и если он это делает, то где, в документации, он дает это обещание?

См. Связанный вопрос Делает ли Perl 6 какие-либо обещания относительно использования порядка чередования?

Ответы [ 3 ]

4 голосов
/ 20 апреля 2009

http://perldoc.perl.org/perlre.html#Combining-RE-Pieces:

если мы сопоставим регулярное выражение a | ab с "abc", совпадет ли оно с подстрокой "a" или "ab"? Один из способов описать, какая подстрока на самом деле совпадает, - это концепция обратного отслеживания (см. «Обратное отслеживание»). Однако это описание слишком низкоуровневое и заставляет задуматься о конкретной реализации.

Другое описание начинается с понятий «лучше» / «хуже»

Опять же, для элементарных фигур такого вопроса не существует, поскольку возможно не более одного совпадения в данной позиции. В этом разделе описывается понятие лучше / хуже для объединяющих операторов. В приведенном ниже описании S и T являются регулярными подвыражениями.

...

  • S | T

Когда S может соответствовать, это лучше, чем когда T может соответствовать.

(В контексте это допустимо только в том случае, если совпадение с использованием S совпадает по крайней мере в начале строки с совпадением с использованием T).

3 голосов
/ 20 апреля 2009

Кажется, что обещание дано в perldoc perlrequick :

Чтобы соответствовать dog или cat, мы формируем регулярное выражение dog|cat. Как и прежде, Perl будет пытаться сопоставить регулярное выражение в самой ранней точке строки. В каждой позиции персонажа perl сначала попытается найти первый вариант, dog. Если dog не совпадает, Perl попытается использовать следующую альтернативу, cat. Если cat тоже не совпадает, то совпадение не выполняется, и perl перемещается на следующую позицию в строке.

perldoc perlretut , кажется, дает обещание еще сильнее (но с оговоркой):

"cats"          =~ /c|ca|cat|cats/; # matches "c"
"cats"          =~ /cats|cat|ca|c/; # matches "cats"

Здесь все альтернативы совпадают в первой строковой позиции, поэтому первая альтернатива - это та, которая соответствует. Если некоторые из альтернатив являются усечениями других, сначала поместите самые длинные, чтобы дать им шанс на совпадение.

"cab" =~ /a|b|c/ # matches "c"
                 # /a|b|c/ == /[abc]/

Последний пример указывает на то, что классы символов похожи на чередование символов. В данной позиции символа первой альтернативой, позволяющей успешно выполнить сопоставление регулярному выражению, будет тот, который соответствует.

1 голос
/ 20 апреля 2009

Обычно движок регулярных выражений по умолчанию в Perl пытается сделать самое длинное и самое длинное совпадение в указанном порядке. Если он может соответствовать крайнему левому варианту чередования и все еще удовлетворять остальным регулярным выражениям, он будет.

Однако вы можете изменить движок регулярных выражений.

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