Функция разделения JavaScript с регулярным выражением RegExp (/ \ s * $ /) - PullRequest
5 голосов
/ 04 июля 2019

это разделение в конце строки с помощью регулярного выражения в качестве разделителя

console.log('ab '.split(/\s*$/));

выводит: ['ab', '']

, но если убрать пробел

console.log('ab'.split(/\s*$/))

выводит: ['ab']

почему у второго нет '' на выходе?

Ответы [ 2 ]

2 голосов
/ 04 июля 2019

Что здесь происходит, так это то, что ваше регулярное выражение /\s*$/ при вводе "ab" фактически эквивалентно /$/, поскольку квантификатор * совпадает между ноль и неограниченное количество раз.

Таким образом, это регулярное выражение будет соответствовать только пустой строке в конце строк в вашем вводе, как видно из этой многострочной версии:

const input = `abc
def
ghi`;

// this will preserve the `\n` new line characters, because we split on the empty `/$/`
console.log(input.split(/\s*$/m));

Однако, определение ECMAScript String.split() содержит специальное примечание, касающееся случая расщепления регулярными выражениями, которые могут соответствовать такой пустой строке, которая гласит:

Значением разделителя может быть пустая строка, пустое регулярное выражение или регулярное выражение, которое может соответствовать пустой строке. В этом случае разделитель не соответствует пустой подстроке в начале или конце входной строки, а также не соответствует пустой подстроке в конце предыдущего совпадения разделителя.

Таким образом, это говорит о том, что первая и последняя пустые строки в нашем вводе отбрасываются (если бы это было иначе, "ab".split('') вернул бы ["", "a", "b", ""]).

Итак, в конце концов, то, что у нас есть, может быть схематизировано до

"ab"
   | // should split here
["ab", ""]
   // but we have to discard first and last empty strings
["ab"]

И вы можете видеть, что то же самое произошло бы с /^/ regex

console.log("ab".split(/^/))
0 голосов
/ 04 июля 2019

split преобразует строку в массив подстрок в новом массиве.Например -

"ab cd".split(" ")

результат: ["ab", "cd"]

разбивается там, где есть пробел " ".но если пробела не будет, будет создан массив, содержащий основную строку.Например -

"abcd".split(" ")

результат: ["abcd"]

Теперь перейдем к части регулярного выражения.

\s используется для поиска символа пробела.

'ab '.split(/\s/) результаты ["ab", ""] и 'ab'.split(/\s/) результаты ["ab"]

Первая строка содержит один пробел, она разделяет строку на две подстроки, но вторая строка не содержит пробелов, поэтомуне создает подстроку.

n* соответствует любой строке, которая содержит ноль или более вхождений n.

, поэтому \s* соответствует любой строке, которая содержит ноль или более пробельных символов.

'ab '.split(/\s*/) результаты ["a", "b", ""] и 'ab'.split(/\s*/) результаты ["a", "b"]

Поскольку первая строка содержит один пробел и один нулевой пробел (всего два), она разбивает строку на три подстроки.но Second String содержит только один нулевой пробел, поэтому он создает две подстроки.

Квантор n$ соответствует любой строке с n в конце.

, поэтому \s*$ соответствует строкелюбая строка, которая хотя бы один пробел.Поскольку он будет совпадать только в конце пробела, если пробелов нет, конца не будет.поэтому он не будет совпадать.

'ab '.split(/\s*$/) результаты ["ab", ""] и 'ab'.split(/\s*$/) результаты ["ab"]

Поскольку первая строка содержит один пробел, она разбивает строку на две подстроки,но из-за отсутствия пробелов во второй строке, она не создаст подстроку.

Короче говоря, (/\s*$/) шаблон ищет любой пробел в конце пробела.Когда вы используете split(/\s*$/), он будет разделяться только при совпадении шаблона.

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