Подтвердить что ты не робот

Группа захвата в регулярном выражении

Я изучаю группы захвата в Regex, и я смущен отсутствием документации. Например, может ли кто-нибудь сказать мне разницу между двумя регулярными выражениями:

/(?:madhur)?/

и

/(madhur)?/

Как мне,? во втором предлагает сопоставить madhur ноль или один раз в строке.

Как первый отличается от второго?

4b9b3361

Ответ 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 и т.д.).