Можете ли вы полагаться на порядок интерпретации синтаксиса регулярных выражений? - PullRequest
0 голосов
/ 21 декабря 2009

(Подоплекой этого вопроса является то, что я подумал, что было бы интересно написать что-то, анализирующее креольскую разметку вики. В любом случае, проблема, на решение которой, я думаю, у меня есть, заключается в различении // в URL и открытии / закрывающий синтаксис для курсивного текста)

Мой вопрос немного сложен, поэтому я попытался разбить его под заголовками

Если существует подстрока (S1), которая может содержать любую из серии подстрок, разделенных |, интерпретатор регулярного выражения просто совпадает с первой подстрокой в ​​пределах 'S1' и затем переходит на регулярное выражение после 'S1' ? Или может в некоторых случаях попытаться найти лучшее / жадное совпадение?

Вот пример, чтобы попытаться прояснить мой вопрос: Строка для поиска в пределах: String
Регулярное выражение: /(?:(Str|Strin).*)/ ('S1' в моем вопросе относится к не захватывающей подстроке

Я думаю, что совпадения из вышеприведенного должны быть:
0 долларов будет String
1 доллар будет Str, а не Strin

Будет ли это всегда происходить или это будут случаи (например, может быть, S1 жадно сопоставляется с использованием *), где будет использоваться другая подходящая подстрока, т.е. Strin в моем примере.

Если вышеизложенное верно, то могу ли я / я должен полагаться на это поведение?

Пример из реального мира

/^\/\/(\b((https?|ftp):\/\/|mailto:)([^\s~]*?(?:~(.|$))?)+?(?=\/\/|\s|$)|~(.|$)|[^/]|\/([^/]|$))*\/\//

Должно соответствовать:

//Some text including a http//:url//

С $ 1 == Some text including a http//:url

Примечание: я пытался сделать это относительно независимым от языка, но я буду использовать php

Ответы [ 2 ]

3 голосов
/ 21 декабря 2009

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

Другой режим, предоставляемый функцией pcre_dfa_exec(), оценивает все возможные совпадения и возвращает максимально возможное совпадение.

0 голосов
/ 21 декабря 2009

В PHP, используя расширение preg, вы можете выбирать между жадными и не жадными операторами (обычно добавляя к ним '?').

Кстати, в приведенном вами примере, если вы хотите, чтобы Strin соответствовало, вы должны инвертировать ваши дела: /(?:(Strin|Str).*)/. Я думаю, вы должны поместить самое общее выражение в конце регулярного выражения.

FYI, с двигателем preg,

оператор чередования не жадный и не ленивый, а упорядоченный

Освоение регулярных выражений, J. Friedl, p175

Если вы хотите использовать жадный движок, вы должны использовать Posix-совместимый движок (ээээ - но он устарел).

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