Группа захвата в регулярном выражении
Я изучаю группы захвата в Regex, и я смущен отсутствием документации. Например, может ли кто-нибудь сказать мне разницу между двумя регулярными выражениями:
/(?:madhur)?/
и
/(madhur)?/
Как мне,? во втором предлагает сопоставить madhur
ноль или один раз в строке.
Как первый отличается от второго?
Ответы
Ответ 1
Первый не сохранит группу захвата, например. $1
будет пустым. Префикс ?:
делает его не захватывающей группой. Обычно это делается для лучшей производительности и неупорядочения обратных ссылок.
Во втором примере символы в группе захвата будут сохранены в backreference $1
.
Дальнейшее чтение.
Ответ 2
Вот наиболее очевидный пример:
"madhur".replace(/(madhur)?/, "$1 ahuja"); // returns "madhur ahuja"
"madhur".replace(/(?:madhur)?/, "$1 ahuja"); // returns "$1 ahuja"
Обратные ссылки сохраняются в порядке, так что первое совпадение может быть вызвано с помощью $1
, второе с $2
и т.д. Если вы зафиксируете соответствие (т.е. (...)
вместо (?:...)
), вы можете использовать они, а если нет, то ничего особенного. В качестве другого примера рассмотрим следующее:
/(mad)hur/.exec("madhur"); // returns an array ["madhur", "mad"]
/(?:mad)hur/.exec("madhur"); // returns an array ["madhur"]
Ответ 3
Это не влияет на сопоставление вообще.
Он сообщает движку регулярных выражений
- не хранить содержимое группы для использования (как $1, $2,...) методом
replace()
- не возвращать его в возвращаемом массиве метода
exec()
и
- не считать его как обратную ссылку (\ 1,\2 и т.д.).