Объясните логику строки [какова механика $1 в методе replace]

Привет, объясните пожалуйста логику строки ( /((\d)\s+\S+\s)\d\s+/, ‘$1’);
К сожалению сам не могу догнать как работает каждый символ в ней.
По отдельности прочитал и знаю что один ищет цифру, второй пробелы, третий не пробелы и так далее, а как они вместе дают результат (убирают 2 после ЛЮБЕРЦЫ) я не понимаю, объясните пожалуйста

var str = '140002 ЛЮБЕРЦЫ 2 ОКТЯБРЬСКИЙ ПР 123/4-115';
var newstr = str.replace( /((\d)\s+\S+\s)\d\s+/, '$1');
console.log(newstr);

Фокус в символе $1
Что делает это выражение:

  1. Найди совпадение по всему regex (2 ЛЮБЕРЦЫ 2)
  2. Возьми совпадение по первой группе (то что во внешних скобках - 2 ЛЮБЕРЦЫ)
  3. Замени полное совпадение тем, что содержится в первой группе. (2 ЛЮБЕРЦЫ 2 => 2 ЛЮБЕРЦЫ)
2 лайка

Привет.

Скобочки в регулярных выражениях выполняют 2 функции: группируют правила а так же “запоминают” строку которая соответствует правилу чтобы потом ее использовать в методах типа replace и exec. Это не единственная “особая” механика где специальные символы ипользуются в работе с регулярками. Вот тут документация про специальные символы в replace: String.prototype.replace() - JavaScript | MDN

Конкретно про твой случай.
/((\d)\s+\S+\s)\d\s+/ тут есть 2 запоминающие группы: ((\d)\s+\S+\s) и (\d). В replace, соответственно, можно использовать строку которая соответствует первой группе с помощью символов $1, второй $2 и так далее. В демонстрации ниже я использую специальный набор символов $& (в документации по ссылке выше он описан) означающий всю строку подходящую под регулярку. Для демонстрации я заменю всю строку, соответствующую регулярке, строкой из

  • всей строки которая соответствует регулярке
  • через разделитель строки которая соответствует первой запоминающей группе
  • через разделитель строки которая соответствует второй запоминающей группе

"140002 ЛЮБЕРЦЫ 2 ОКТЯБРЬСКИЙ ПР 123/4-115".replace(/((\d)\s+\S+\s)\d\s+/, "___ $&||$1||$2 ___")
// "14000___ 2 ЛЮБЕРЦЫ 2 ||2 ЛЮБЕРЦЫ ||2 ___ОКТЯБРЬСКИЙ ПР 123/4-115"

Тут видно что все что между символами ___ , совпало с регуляркой. И какие именно подстроки соответствуют запоминающим группам $1: 2 ЛЮБЕРЦЫ, $2: 2. После этого думаю стало понятнее что var newstr = str.replace( /((\d)\s+\S+\s)\d\s+/, ‘$1’); это замена подстроки которая соответствует регулярке, подстрокой соответсвующей подрегуляке из запоминающих скобок.

2 лайка