[英]Regex exec function not returning correct result in Javascript
我正在嘗試編寫一個函數,該函數將以7:55am - 9:10am (TR) 8:10am - 9:00am (W)
的形式解析一個字符串,並輸出一個包含正則表達式結果的多維 ] 數組(例如[[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()
之間的正則表達式字符串是否發生了什么變化?
請讓我知道你的想法!
這就是[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)");
或者更短的方式:
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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.