15

我有这个简单的字符串:

"a1a2a3"

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

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

我试过这个:

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

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

ps

我可以做到这一点,Match但我正在寻找(如果存在)可以帮助我使用的正则表达式split

4

3 回答 3

20

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]使其适用于所有情况。

于 2013-08-24T14:53:35.390 回答
4

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

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

"a1a2a3".split(/(..)/).filter(function(a){
    return a !== '';
});
于 2013-08-23T16:09:19.947 回答
2

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

如果是这样,您可以尝试:

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

输出:

["abc123", "d56", "efg8", "t5"]
于 2013-08-23T16:38:34.943 回答