Путаница в чередовании - PullRequest
0 голосов
/ 22 июня 2011

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

Источник

Этот шаблон, который ищет одно двойное слово (например, this this)

\b([a-z]+)((?:\s|<[^>]+>)+)(\1\b)

У меня одна путаница, если я введу эту тему:

Это соответствуетс патерном.

"<i>whatever<i>         whatever"

\b([a-z]+) Совпадение

((?:<[^>]+>|\s)+) Следует за одним TAG, поэтому второе альтернативное совпадение.

(\1\b) Должны совпадать, если следуетто же слово возвращается в первых скобках.

Зачем совпадать, если после тега не следует '(\1\b)', следует пробел.

Я знаю, что в чередовании существуют \s.

Но не предполагается, что совпадение TAG потребляет чередование?

Почему альтернатива \s все еще жива?

Ответы [ 2 ]

2 голосов
/ 22 июня 2011

Чередование контролируется квантификатором +:

(?:\s|<[^>]+>)+

... поэтому он пытается соответствовать несколько раз. Каждый раз он может попробовать обе альтернативы: сначала \s, а в случае неудачи <[^>]+>.

В первый раз \s не соответствует, но <[^>]+> успешно соответствует <i>.

Во второй раз \s соответствует одному пробелу.

В третий раз \s соответствует другому пробелу.

... и так далее, пока все места не будут заняты.

2 голосов
/ 22 июня 2011

Это + означает «один или несколько из (?:\s|<[^>]+>)».Да, first из них потребляет тег, но может быть бесконечное количество дополнительных тегов или пробелов, прежде чем (\1\b) следует.

\b([a-z]+)((?:\s|<[^>]+>)+)(\1\b)
                         ^
...