簡體   English   中英

正則表達式 exec 函數未在 Javascript 中返回正確的結果

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM