Разделить строку на группы из 2 символов с помощью split?

у меня есть эта простая строка:

"a1a2a3"

есть ли выражение regex, которое можно использовать с split команда, чтобы разделить строку на пары ? :

["a1","a2","a3"] ?

Я попытался это :

"a1a2a3".split(/(?=..)/)

но он возвращает ["a", "1", "a", "2", "a3"]

п.з.

я могу сделать это с Match но я ищу (если существует) для выражения regex, которое может помочь мне использовать split.

3 ответов


split для четной длины строки:

str.split(/(?=(?:..)*$)/)

split для строки нечетной длины последняя запись имеет один символ:

str.split(/(?=(?:..)*.$)/)

это в основном look-aheads, которые проверяют, является ли количество символов впереди нечетным или четным. Он использует тот факт, что количество символов впереди всех разделенных позиций имеет ту же четность, что и длина строки.

шаблон в (четной версии) look-ahead является (?:..)*$, которым проверяет четное количество символов (?:..)* до конца строки $. (Обратите внимание, что группа без захвата (?:pattern) используется здесь, иначе группа захвата создаст дополнительные записи в split результат). Аналогичное объяснение применимо и к нечетной версии.

обратите внимание, что . исключает несколько новых символов строки: \n, \r, \u2028 или \u2029. Это приведет к неожиданному результату для строки, содержащей такие символы. Заменять . С [\s\S] (или другая эквивалентная конструкция), чтобы он работал для всех случаев.


для практических целей, match является правильным инструментом для работы:

str.match(/..?/g)

например:

"1234567890".match(/..?/g)
> [ "12", "34", "56", "78", "90" ]

"1234567890".match(/..?/g)
> [ "12", "34", "56", "78", "9" ]

решение может быть расширена до группы из n символов:

str.match(/.{1,<n>}/g)

например:

"123456789012345678901234567890".match(/.{1,7}/g)
> [ "1234567", "8901234", "5678901", "2345678", "90" ]

он просто использует "жадный" квантификатор и создает группы из n символов, из символов чтобы соответствовать последней группе.

же, как и выше, вы можете изменить . to [\s\S] чтобы он работал для всех случаев.


Я уже ответил на это в чате. Вы действительно должны использовать String.prototype.match.

можно сделать с split? Технически, да. Вы можете разделить его на /(..)/ и затем отфильтровать пустые строки.

"a1a2a3".split(/(..)/).filter(function(a){
    return a !== '';
});

Я не уверен, что все возможные форматы входных строк, но я предполагаю, что это какая-то буква, за которой следуют некоторые цифры.

Если это так, вы можете попробовать:

var str = 'abc123d56efg8t5'
var res = str.split(/([a-z]+[0-9]+)/).filter(Boolean);

выход:

["abc123", "d56", "efg8", "t5"]