Выкройка:^\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 это относятся к выражение или результат выражения ?
Он ссылается на результат выражения (что на самом деле захвачен), а не само выражение.
'_?' Означает совпадение 0 или 1 '_', что делает' _' необязательным. Регулярное выражение первоначально будет соответствовать первой захваченной группе, но затем отступит и отбросит ее, потому что вы ожидаете хотя бы одного символа во второй захваченной группе. –
@CrayonViolent, если он соответствует '_' для первой группы, он должен соответствовать' _' в '\ 1'.Использует ли '\ 1' выражение или результат выражения? – vamsiampolu
'\ 1' - это просто ссылка на первую захваченную группу. Если ничего не соответствует, нечего ссылаться. см. мое выше правление о том, как он изначально соответствует, но дает его –