使用split将字符串拆分为2个字符的组?

Roy*_*mir 12 javascript regex split

我有这个简单的字符串:

"a1a2a3"

是否有任何正则表达式可以与split命令一起使用,因此它会将字符串拆分为一对?:

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

我试过这个:

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

但它回来了 ["a", "1", "a", "2", "a3"]

PS

我可以这样做Match但我正在查找(如果存在)正则表达式可以帮助我使用split.

nha*_*tdh 11

split 对于偶数长度字符串:

str.split(/(?=(?:..)*$)/)
Run Code Online (Sandbox Code Playgroud)

split 对于奇数长度字符串,最后一个条目具有单个字符:

str.split(/(?=(?:..)*.$)/)
Run Code Online (Sandbox Code Playgroud)

这些基本上是先行,检查前面的字符数是奇数还是偶数.它利用了以下事实:所有分割位置前面的字符数具有与字符串长度相同的奇偶校验.

(偶数版本)前瞻中的模式是(?:..)*$,(?:..)*在字符串结束之前检查偶数个字符$.(请注意,(?:pattern)此处使用非捕获组,否则捕获组将在split结果中创建额外条目).类似的解释适用于奇数版本.

需要注意的是. 排除了几个换行符:\n,\r,\u2028\u2029.它会对包含这些字符的字符串产生意外结果.替换.[\s\S](或其他等效构造)以使其适用于所有情况.


出于实用目的,这match是工作的正确工具:

str.match(/..?/g)
Run Code Online (Sandbox Code Playgroud)

例如:

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

"1234567890".match(/..?/g)
> [ "12", "34", "56", "78", "9" ]
Run Code Online (Sandbox Code Playgroud)

该解决方案可以扩展为n个字符组:

str.match(/.{1,<n>}/g)
Run Code Online (Sandbox Code Playgroud)

例如:

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

它只是利用了贪婪的量词并创建了n个字符的组,然后用完了最后一组的字符.

同上,你可能想改变.,以[\s\S]使其所有情况下工作.


nde*_*ore 5

我已经在聊天中回答过这个问题了。你真的应该使用String.prototype.match.

可以用split来完成吗?从技术上来说,是的。您可以将其拆分/(..)/,然后过滤掉空白字符串。

"a1a2a3".split(/(..)/).filter(function(a){
    return a !== '';
});
Run Code Online (Sandbox Code Playgroud)

  • 或 `"a1a2a3".split(/(..)/).filter(Boolean)` (7认同)
  • @CrazyTrain 不错!让我们砍掉一个字节并使用 String 代替。`"a1a2a3".split(/(..)/).filter(String)` (3认同)