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

时间:2013-08-23 16:05:58

标签: javascript regex split

我有这个简单的字符串:

"a1a2a3"

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

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

我试过这个:

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

但它会返回["a", "1", "a", "2", "a3"]

P.S。

我可以使用Match执行此操作,但我正在查找(如果存在)正则表达式,这可以帮助我使用split

3 个答案:

答案 0 :(得分:10)

split为偶数长度字符串:

str.split(/(?=(?:..)*$)/)
对于奇数长度字符串,

split,最后一个条目具有单个字符:

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

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

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

请注意. excludes several new line characters\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],以使其适用于所有情况。

答案 1 :(得分:4)

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

可以用拆分完成吗?从技术上讲,是的。您可以按/(..)/拆分它,然后过滤掉空字符串。

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

答案 2 :(得分:2)

我不确定输入字符串的所有可能格式是什么,但我认为它是一些字母后跟一些数字。

如果是这样,你可以试试:

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

<强>输出:

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