2015-06-05 2 views
3

Глядя на это ^\s*(_?)(\S+?)\1\s*$ Регулярное выражение от injector.js.Как это регулярное выражение по группам

Я смог понять, как соответствует строка _non_. Первая группа захвата состоит из _, вторая группа состоит из non, и ссылка на результат первой группы захвата дает вам _. Итак, первая группа - _, вторая группа - non, а третья группа - _.

Однако, я не был в состоянии понять, как струны _, _non и __ подбираются второй группе, получавшей ссылка на \1 в выражении, которое будет ожидать _ в конце дается _ в начале ,

+0

'_?' Означает совпадение 0 или 1 '_', что делает' _' необязательным. Регулярное выражение первоначально будет соответствовать первой захваченной группе, но затем отступит и отбросит ее, потому что вы ожидаете хотя бы одного символа во второй захваченной группе. –

+0

@CrayonViolent, если он соответствует '_' для первой группы, он должен соответствовать' _' в '\ 1'.Использует ли '\ 1' выражение или результат выражения? – vamsiampolu

+0

'\ 1' - это просто ссылка на первую захваченную группу. Если ничего не соответствует, нечего ссылаться. см. мое выше правление о том, как он изначально соответствует, но дает его –

ответ

5

Выкройка:^\s*(_?)(\S+?)\1\s*$

В целом, эта картина:

^ старт в начале строки

\s* матч 0 или более символов

(_?) матч и захвата 0 или 1 подчеркивание (группа захвата 1)

(\S+?) нежадным матча и захват 1 или более непробельным символ (захват группы 2)

\1 матч за то, что был подобран в группе захвата 1

\s* матч 0 или более пробельных символов

$ конец матча строки/строки

Тема:_

Группа 1:

Группа 2: _

Первоначально это будет соответствовать в первой группе захвата. Но затем двигатель переходит к второй группе захвата и ожидает, что по крайней мере один символ будет соответствовать, поэтому двигатель отступает и берет символ из первой группы захвата, потому что ? в первой группе захвата делает его необязательным, а _ является непространственный символ. Затем, поскольку в группе захвата 1 ничего не было найдено (потому что группа 2 должна была быть удовлетворена), нет ничего, что можно было бы найти в обратной ссылке \1.

Тема:_non

Группа 1:

Группа 2: _non

Первоначально _ подобран в группе 1, а затем non подобран в группе 2.Затем двигатель ищет _ для этого \1 ссылки, и нет никого, поэтому двигатель откатывается и спичка удаляет его из группы 1 и соответствует его в группе 2.

Тема:_non_

Группа 1 : _

Группа 2: non

аналогичен предыдущему: Первоначально _ подобран в группе 1, а затем non подобран в группе 2 Затем двигатель ищет _ для этой ссылки \1, которую он соответствует, поэтому группа 1 сохраняет свой _, а группа 2 имеет non.

Тема:__

Группа 1:

Группа 2: __

Это, по существу такой же, как первый _ примере. Изначально первый _ сопоставляется в группе 1. Затем второй _ сопоставляется в группе 2. тогда \1 пытается сопоставить другой _, так как группа 1 получила один, но его нет. Но группа 2 требует, по меньшей мере, 1 символ, но может быть больше, так что движок регулярных выражений поддерживает и ставит 1-й группы матча в группе 2.

Тема:_ _

Группа 1:

Группа 2 :

Это не соответствует. Двигатель запускает первый _ в группу 1, но затем не удается разместить пространство в группе 2. Таким образом, он выполняет резервное копирование и пытается поместить первый _ в группу 2. Поскольку нет группы 1, также нет \1 совпадение. Затем пробел сопоставляется \s*, но после этого совпадение не завершается в окончательном _, потому что шаблон говорит только пробелы перед концом строки.

Sidenote

Вы спросили в комментариях:

, если он соответствует _ для первой группы это должно совпадать с _ в в \1\1 .Does это относятся к выражение или результат выражения ?

Он ссылается на результат выражения (что на самом деле захвачен), а не само выражение.

Смежные вопросы