求解stringObject.split(RegExp)出现字符串分隔错误?

新手上路,请多包涵

string.split(RegExp)方法使用正则表达式分隔字符串,当正则表达式含有小括号()的时候翻个的字符串会出现错误,但是通过string.match(RegExp)的时候返回的值是我想要的是正确的
例如

var str = '【广州市】 【广州黄埔】(020-12345678、020-87654321) 的 88888888表带 () 已揽收';
var reg = /(\d{3}-)?\d{7,9}/g;
var phones = str.match(reg);
console.log(phones);
var arr = str.split(reg);
console.log(arr);
var element = [];
for(var i=0;i<arr.length;i++){
    var item = {
        text:arr[i],
        click:false
    }
    element.push(item);
    if(i==arr.length-1){
        break;
    }
    var item2 = {
        text:phones[i],
        click:true
    }
    element.push(item2);
}
console.log(element);

然后我理想的返回结果是

clipboard.png

上图是正则表达式中没有加括号时强制性要求添加区号的返回结果

var reg = /\d{3}-\d{7,9}/g;//上图的结果使用该正则
var reg = /(\d{3}-)?\d{7,9}/g;//下图的结果使用该正则

然而加了括号条件以后,使用str.split(reg)以后得到的却是一个很奇怪的结果,里面拆分的结果不仅出现了奇怪的断句错误,还出现带有undefined的数据

clipboard.png
导致我后面的循环直接出现更大的错误,求解正则中添加括号出现这样的问题怎么处理?

阅读 2.9k
1 个回答

原因是split在处理含有捕获组的正则的时候,会把捕获组里面捕获到的数据也当做分割后结果的一部分。如下:
图片描述

代码如下:

var str="abclskd,jsldk-lskdfj778,jsdkf*jdkf";
var regex1=/[,*-]/;
str.split(regex1);
(5) ["abclskd", "jsldk", "lskdfj778", "jsdkf", "jdkf"]

var regex2=/([,*-])/;
str.split(regex2);
(9) ["abclskd", ",", "jsldk", "-", "lskdfj778", ",", "jsdkf", "*", "jdkf"]

var regex3=/(?:[,*-])/;
str.split(regex3);
(5) ["abclskd", "jsldk", "lskdfj778", "jsdkf", "jdkf"]

所以,为了不出现这样的结果,你把()改为(?:)

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题