Путаница в чередовании

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

Источник

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

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

У меня есть одно замешательство, если я представлю эту тему:

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

"<i>whatever<i>         whatever"

\b([a-z]+) Матч

((?:<[^>]+>|\s)+) Следует один TAG, так что 2-й альтернативный матч.

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

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

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

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

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

2 ответа

Решение

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

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

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

Первый раз, \s не соответствует, но <[^>]+> удается сопоставить <i>,

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

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

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

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

\b([a-z]+)((?:\s|<[^>]+>)+)(\1\b)
                         ^
Другие вопросы по тегам