2013-08-23 250 views
10

我有这个简单的字符串:使用拆分将字符串拆分为2个字符组?

"a1a2a3"

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

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

我已经试过这样:

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

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

附:

我可以做Match,但即时通讯(如果存在)的正则表达式可以帮助我使用split

+0

你想使用一种可以删除字符的方法保留字符的动机是什么? –

+0

这有多高? A1-A100 ...超越? a1-9,b1-9等? – smerny

+0

我想我已经在几个月前看到了分裂的答案,但是我没有找到答案。 –

回答

9

split即使长度的字符串:

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

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

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

这些基本上是超前检查,检查前面的字符数是奇数还是偶数。它利用了所有分割位置前面的字符数与字符串长度具有相同的奇偶性。

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

注意.excludes several new line characters\n\r\u2028\u2029。它会产生意想不到的结果,包含这些字符的字符串将.替换为[\s\S](或其他等效构造),以使其适用于所有情况。

+0

终于。这可以将一元条件缩短为1表达式...'str.length%2 == 0? /../:/../' –

+1

+1这非常漂亮 –

4

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

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

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

或''a1a2a3“.split(/(..)/)。filter(布尔)' –

+3

@CrazyTrain尼斯!让我们砍掉一个字节,然后使用String。 '“a1a2a3”.split(/(..)/)。filter(String)' – nderscore

+0

@CrazyTrain ...为什么这个工作? –

2

我不知道什么是输入字符串的所有可能的格式,但我以为这是一些字母加一些数字。

如果是的话,你可以尝试:

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

输出:

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