(/ \ s + (\ W) / g, '$ 1') - как удаляются пробелы? - PullRequest
0 голосов
/ 27 февраля 2019

let a = ' lots of spaces in this ! ' console.log(a.replace(/\s+(\W)/g, '$1'))

Журнал показывает много пробелов в этом!

Вышеуказанное регулярное выражение делает именно то, что я хочу, но я пытаюсь понять, почему?Я понимаю следующее:

  • s + ищет 1 или более пробелов
  • (\ W) захватывает не алфавитно-цифровыесимволы
  • / г - глобальный, поиск / замена всех
  • $ 1 возвращает предыдущий буквенно-цифровой символ

capture / $ 1 - это то, что убирает пробел между словами Это и !

Я получаю это, но я не получаю это КАК удаляются все остальные пробелы ??Я не верю, что попросил их (хотя я рад, что они есть).

Я получаю это console.log(a.replace(/\s+/g, ' '));, потому что замена заменяет 1 или более пробелов между буквенно-цифровыми символами одним пробелом '».

Я чешу голову, чтобы понять, КАК первый RegEx /\s+(\W)/g, '$1' заменяет один или несколько пробелов одним пробелом.

Ответы [ 3 ]

0 голосов
/ 27 февраля 2019

Ваше регулярное выражение говорит: «сопоставьте один или несколько пробелов, за которыми следует один или несколько не алфавитно-цифровых символов, и замените весь этот результат этим одним или несколькими не алфавитно-цифровыми символами».Ключ в том, что \s+ является жадным, что означает, что он будет пытаться сопоставить как можно больше символов.Таким образом, в любой заданной строке пробелов он будет пытаться сопоставить все пробелы, которые он может.Однако вашему регулярному выражению также требуется один или несколько несловарных символов (\W+).Поскольку в вашем случае следующий символ после каждого последнего пробела является символом слова (то есть буквой), эта последняя часть регулярного выражения должна соответствовать последнему пробелу.

Поэтому, учитывая строку a b и используя парены, чтобы пометить совпадения \s+ и \W+, a( )( )b является единственным способом для регулярного выражения (\s+ соответствует первомудва пробела и \W+ соответствует последнему пробелу).Теперь это просто простая замена.Поскольку вы заключили \W+ в круглые скобки, что делает его первой и единственной группой захвата, поэтому замена соответствия на $1 заменит его на этот последний пробел.

В качестве другого примера, запустив эту замену против a !b приведет к тому, что совпадение будет выглядеть как a( )(!)b (поскольку ! теперь является последним не состоящим из символов), поэтому окончательный замененный результат будет a!b.

0 голосов
/ 27 февраля 2019

Список совпадений будет следующим.Я заменил пробел на , чтобы его было легче увидеть

  "☹☹☹☹(☹)",
  "☹☹☹☹(☹)",
  "☹☹(!)",
  "☹(☹)"

И в коде сказано заменить совпадение на то, что находится в группе захвата.

' lots of☹☹☹☹(☹)spaces☹☹☹☹(☹)in this☹☹(!)☹(☹)'

поэтому при его замене вы получите

' lots of☹spaces☹in this!☹'

0 голосов
/ 27 февраля 2019

Давайте возьмем эту строку 'aaa &bbb' и пробежимся по ней.

Мы получаем 'aaa & bbb'

  • \ s + захватывает 3 пробела перед амперсандом
  • (\ W) берет амперсанд
  • $ 1 - амперсанд и заменяет ' &' на '&'

То же самое относится и к пробелам.Вы заставляете одно из мест удовлетворить группу захвата (\W) для замены.Это также, почему ваш восклицательный знак не обстрелян.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...