正则表达式exec函数在Javascript中没有返回正确的结果

时间:2016-04-05 20:51:19

标签: javascript regex function

我正在尝试编写一个函数,它将以7:55am - 9:10am (TR) 8:10am - 9:00am (W)的形式解析一个字符串并输出一个包含正则表达式结果的多维数组(ex [[7:55am, 9:10am, TR], [7:55am, 9:00am, W]]

这是我目前的职能:

function parseClassTime(times) {
    console.log("Input: " + times);
    var timeArr = [];
    var finalArr = [];
    regexStr = /(\d{1,2}:\d{2}[ap]m) - (\d{1,2}:\d{2}[ap]m) \((\w{1,5})\)/g;
    if (times.indexOf(") ") > -1) {
        times = times.replace(") ", ")&");
        timeArr = times.split("&");
    } else {
        timeArr.push(times);
    }
    console.log("timeArr: " + timeArr);
    for (i = 0; i < timeArr.length; i++) {
        console.log(i + ":" + timeArr[i]);
        console.log("regexResult: " + regexStr.exec(timeArr[i]));
    }
};

这是我得到的输出:

Input: 7:55am - 9:10am (TR) 8:10am - 9:00am (W)
timeArr: 7:55am - 9:10am (TR),8:10am - 9:00am (W)
0:7:55am - 9:10am (TR)
regexResult: 7:55am - 9:10am (TR),7:55am,9:10am,TR
1:8:10am - 9:00am (W)
regexResult: null

对于我的生活,我无法发现null的来源。两次调用.exec()之间的正则表达式字符串是否发生了什么?

请让我知道你的想法!

1 个答案:

答案 0 :(得分:1)

这就是[RegExp.exec()][1]的工作原理:lastIndex属性在第一次匹配后设置为20并且您没有重置它。第二次,它无法匹配,因为它开始在位置20处寻找匹配。这一切都是这样的,因为正则表达式是使用全局修饰符/g构建的。

  

如果正则表达式使用"g"标志,则可以多次使用exec()方法在同一字符串中查找连续匹配。执行此操作时,搜索从正则表达式lastIndex属性

指定的str子字符串开始

您可以手动重置regexStr.lastIndex

&#13;
&#13;
function parseClassTime(times) {
    console.log("Input: " + times);
    var timeArr = [];
    var finalArr = [];
    regexStr = /(\d{1,2}:\d{2}[ap]m) - (\d{1,2}:\d{2}[ap]m) \((\w{1,5})\)/g;
    if (times.indexOf(") ") > -1) {
        times = times.replace(") ", ")&");
        timeArr = times.split("&");
    } else {
        timeArr.push(times);
    }
    console.log("timeArr: " + timeArr);
    for (i = 0; i < timeArr.length; i++) {
        regexStr.lastIndex = 0;              // <= HERE!!
        console.log(i + ":" + timeArr[i]);
        console.log("regexResult: " + regexStr.exec(timeArr[i]));
    }
};

parseClassTime("7:55am - 9:10am (TR) 8:10am - 9:00am (W)");
&#13;
&#13;
&#13;

或更短的方式:

&#13;
&#13;
var finalArr = [];
var regexStr = /(\d{1,2}:\d{2}[ap]m) - (\d{1,2}:\d{2}[ap]m) \((\w+)\)/g;
var times = "7:55am - 9:10am (TR) 8:10am - 9:00am (W)";
while ((m=regexStr.exec(times)) !== null) {
	finalArr.push([m[1], m[2], m[3]]);
}
console.log(finalArr);
&#13;
&#13;
&#13;