我正在尝试编写一个函数,它将以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()
之间的正则表达式字符串是否发生了什么?
请让我知道你的想法!
答案 0 :(得分:1)
这就是[RegExp.exec()][1]
的工作原理:lastIndex
属性在第一次匹配后设置为20并且您没有重置它。第二次,它无法匹配,因为它开始在位置20处寻找匹配。这一切都是这样的,因为正则表达式是使用全局修饰符/g
构建的。
如果正则表达式使用
指定的"g"
标志,则可以多次使用exec()
方法在同一字符串中查找连续匹配。执行此操作时,搜索从正则表达式lastIndex
属性str
子字符串开始
您可以手动重置regexStr.lastIndex
:
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;
或更短的方式:
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;