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

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

"a1a2a3"

Есть ли какое-либо выражение регулярного выражения, которое можно использовать с командой split, чтобы он разделил строку на пары?

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

Я пробовал это:

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

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

p.s.

Я могу сделать это с помощью Match, но im look (if exists) для выражения регулярного выражения, которое может помочь мне с помощью split.

Ответ 1

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

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

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

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

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

Паттерн в (четной версии) прогнозирования - (?:..)*$, который проверяет четное количество символов (?:..)* перед концом строки $. (Обратите внимание, что здесь используется группа без захвата (?: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 символов перед тем, как заканчиваются символы, соответствующие последней группе.

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

Ответ 2

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

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

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

Ответ 3

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

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

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

выход:

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