我有这个简单的字符串:
"a1a2a3"
是否有任何正则表达式可以与split
命令一起使用,因此它会将字符串拆分为一对? :
["a1","a2","a3"]
?
我试过这个:
"a1a2a3".split(/(?=..)/)
但它会返回["a", "1", "a", "2", "a3"]
P.S。
我可以使用Match
执行此操作,但我正在查找(如果存在)正则表达式,这可以帮助我使用split
。
答案 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"]