Ответ 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]
, чтобы он работал во всех случаях.