在JavaScript中每隔第二个逗号进行分割

12

字符串:

'29 July, 2014, 30 July, 2014, 31 July, 2014'

如何在字符串中每隔第二个逗号分割?以便我的结果为:

[0] => 29 July, 2014
[1] => 30 July, 2014
[2] => 31 July, 2014

生成“2014年7月29日,2014年7月30日,2014年7月31日”的是什么? - GCallie
你的字符串来自数组吗? - Tohveli
是的,它是一个键值对数组中的 [other_dates] => 'stringstringstring' - pjmil
6个回答

17

或者这个:

var text='29 July, 2014, 30 July, 2014, 31 July, 2014';
result=text.match(/([0-9]+ [A-z]+, [0-9]+)/g);

更新:

您可以使用此正则表达式查找所有匹配项:

//    result=text.match(/[^,]+,[^,]+/g);

    var text='string1, string2, string3, string4, string5, string 6';
    result=text.match(/[^,]+,[^,]+/g);

/*
result: 
string1, string2
string3, string4
string5, string 6
*/

当然可以!您可以在jsfiddle上查看它 jsfiddle.net/y4rfE/。在jsfiddle上我稍微修改了代码,代码不仅依赖于字符串中的日期。 - SlyBeaver
哦!谢谢你纠正我的打字错误 :) 我正在删除上面的注释,以使它更清晰;这是一个没有jQuery的工作fiddle [链接](http://jsfiddle.net/MarmeeK/5sakK/3/) - MarmiK
继续你的好工作,怎么样考虑使用 s.match(/[^,]+,[^,]+/g) 使它变得更加通用? - sifriday
是的,这是最好的正则表达式。我已经在答案中添加了这段代码。谢谢! - SlyBeaver
1
它会吞掉像'string1,string2,string3'这样的字符串的最后一部分。改进建议-匹配(/([^,]+,[^,]+)|([^,]+)/g); - Saulius

3

您可以使用正则表达式进行拆分。例如:

var s = '29 July, 2014, 30 July, 2014, 31 July, 2014';
s.split(/,(?= \d{2} )/)

返回值

["29 July, 2014", " 30 July, 2014", " 31 July, 2014"]

如果你所有的日期都是两位数字的天数,比如7月1日将打印为01 July,则这个方法可以正常工作。

该正则表达式使用了前瞻断言,因此它的含义是“以逗号分隔,如果接下来的四个字符为[空格][数字][数字][空格]”。


编辑 - 我刚刚改进了这个方法,现在它可以处理2014年7月1日和2014年7月01日两种格式:

s.split(/,(?= \d{1,2} )/)

编辑 - 我注意到我和SlyBeaver的努力都没有处理空格;第二个和第三个日期都有前导空格。这里是一个修剪空格的拆分解决方案:
s.split(/, (?=\d{1,2} )/)

通过将问题空间转移到分隔符中并丢弃它,来解决问题。
["29 July, 2014", "30 July, 2014", "31 July, 2014"]

我对此只有一点点模糊的了解,所以这个问题给了我一个很好的机会来尝试一下。我想知道的是,按照SlyBeaver在下面提到的建议,进行拆分操作和全局匹配之间是否有任何优点呢? - sifriday
这也是一个匹配。此外,该方法无法解析此字符串:string1,string2,string3,string4,string5,string6。但是我的方法可以解析它 ;) - SlyBeaver
感觉目标是要使用正则表达式在第二个逗号处进行拆分/匹配,而不考虑日期,是吧?我开始认为match使构建正确的正则表达式更容易。我想知道是否存在性能差异? - sifriday
我认为正则表达式速度较慢。但是这只是简单的JavaScript,可能不是关键问题。 - SlyBeaver
我进行了一个非常快速的测试,匹配(match)比分割(split)更快。但是我必须运行100,000次迭代才能获得十分之一秒的差异。所以,是的,这是过早的优化 :-) - sifriday

2

不确定是否可以在一行代码中完成,但是一个解决方法是在每个逗号上进行拆分,然后连接连续的值。

例如:

var str = '29 July, 2014, 30 July, 2014, 31 July, 2014';
var list = str.split(",");
var list2 =[];
for (var i=0;i<list.length; i+=2){
    list2.push(list[i]+","+list[i++]);
}

只是好奇,这个for循环看起来不会遍历整个数组长度,因为你有list.length/2。 - g00dnatur3

1
我知道这已经是将近两年前的事了。
这个函数是可重复使用的。
String.prototype并不是使其工作所必需的。但它很容易使用。
String.prototype.splitEvery = function ( splitter, every ){

    var array = this.split( splitter), newString = '', thisSplitter; 

    $.each( array, function( index, elem ){ 

        thisSplitter = ( index < array.length - 1 || index % every === 0 ) ? '' : splitter;

        newString += elem + thisSplitter;                                                               
    });          

    return newString;                                                                                   
};  


var dateString = '29 July, 2014, 30 July, 2014, 31 July, 2014';

在这种情况下的用法是:


dateString.splitEvery( ',', 2 );

第一个参数是分隔符,第二个参数是每个之间的数量。

结果为:

29 July 2014, 30 July 2014, 31 July 2014

请注意,此解决方案会丢弃被跳过的分隔符。 - Kevin Stich

1
像这样。
 var str = '29 July, 2014, 30 July, 2014, 31 July, 2014'

 var parts = str.split(',')

 var answer = []

 for (var i=0; i<parts.length; i++) {
        if (i < 1) continue;
        if (i % 2 == 1) {
           answer.push(parts[i-1] + ',' + parts[i]);
        }
 }

 console.log(answer)

因此,在i=1时,它将连接parts[0] + ',' + parts[1]并将其推送到answer[0],在i=3时,它将连接parts[2] + ',' + parts[3]并将其推送到answer[1],依此类推... - g00dnatur3
虽然我非常喜欢正则表达式的答案,但这个解决方案并不依赖于您的数据格式。它只会在每第二个逗号处分割,而不管您的数据格式如何。 - g00dnatur3

0

这不是一个重构的解决方案,但它可以工作:

var $dates = '29 July, 2014, 30 July, 2014, 31 July, 2014';
$dates = $dates.split(',');
$result = [];
$dateValue = '';

for($i=0 ; $i<$dates.length ; $i++) {
if($i % 2 != 0 && $i > 0) {
            $dateValue += ','+$dates[$i];
    $result.push($dateValue);
    $dateValue = '';
} else {
    $dateValue += $dates[$i];
}
}

console.log($result);

这不是Javascript。可能是PHP? - SlyBeaver
@SlyBeaver 这是JS代码,他只是在每个变量名前添加了*$*。 - Alexandru Severin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接