Разделить строку на группы из 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"]