我修改了一個正則表達式,我得到here。我需要改變它,因爲我需要它符合以下附加標準:這個正則表達式可以更有效嗎?
- 日期只有月份和年份
- 全日期的形式毫米DD,YYYY與年僅
- 日期輸入無關信息(如卷51,第1號,2008年3月)
這是我迄今爲止。我用RegexBuddy做了這件事來幫助我解析邏輯,但它非常複雜,我不確定我是否有最有效的解決方案。
\b(?:((Jan(uary)?|Feb(ruary)?|Ma(r(ch)?|y)|Apr(il)?|Ju((ly?)|(ne?))|Aug(ust)?|Oct(ober)?|(Sept|Nov|Dec)(ember)?)|((((Jan(uary)?|Ma(r(ch)?|y)|Jul(y)?|Aug(ust)?|Oct(ober)?|Dec(ember)?) 31)|((Jan(uary)?|Ma(r(ch)?|y)|Apr(il)?|Ju((ly?)|(ne?))|Aug(ust)?|Oct(ober)?|(Sept|Nov|Dec)(ember)?) (0?[1-9]|([12]\d)|30))|(Feb(ruary)? (0?[1-9]|1\d|2[0-8]|(29(?=, ((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))))),)) ((1[6-9]|[2-9]\d)\d{2}))|((1[6-9]|[2-9]\d)\d{2})
有什麼可以做,以保持雙方原有的正則表達式和我的附加標準的功能?
這裏是我實現這個的代碼,如果它可以幫助你看到我想要做的。的parseDate函數的輸出被認爲是其形式爲「月日」的字符串日期(即,實施例4應該輸出「2008年3月」):
//generalized RegEx function
function returnRegExMatch(ex,haystack) {
var needle = ex.exec(haystack);
if (needle) { return needle[0]; }
}
// date extraction (uses returnRegExMatch)
function parseDate(date) {
//strip anything other than a valid date
var dateRe = /\b(?:((Jan(uary)?|Feb(ruary)?|Ma(r(ch)?|y)|Apr(il)?|Ju((ly?)|(ne?))|Aug(ust)?|Oct(ober)?|(Sept|Nov|Dec)(ember)?)|((((Jan(uary)?|Ma(r(ch)?|y)|Jul(y)?|Aug(ust)?|Oct(ober)?|Dec(ember)?) 31)|((Jan(uary)?|Ma(r(ch)?|y)|Apr(il)?|Ju((ly?)|(ne?))|Aug(ust)?|Oct(ober)?|(Sept|Nov|Dec)(ember)?) (0?[1-9]|([12]\d)|30))|(Feb(ruary)? (0?[1-9]|1\d|2[0-8]|(29(?=, ((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))))),)) ((1[6-9]|[2-9]\d)\d{2}))|((1[6-9]|[2-9]\d)\d{2})/;
date = returnRegExMatch(dateRe,date);
var yearRe = /[0-9][0-9][0-9][0-9]/;
var monthRe = /Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec/;
var dayRe = /[0-9]?[0-9],/;
var year = returnRegExMatch(yearRe,date);
var month = returnRegExMatch(monthRe,date);
var day = parseInt(returnRegExMatch(dayRe,date),10);
var dateReturned = "";
if (year) { dateReturned = year; }
if (month) { dateReturned = dateReturned + " " + month; }
if (month && day) { dateReturned = dateReturned + " " + day; }
return dateReturned;
}
謝謝!
編輯 感謝所有花時間回覆。你們做了我所希望的事,指出了我實施過程中最荒謬的事情。我決定簡化主要的正則表達式。結果如下:
\b(?:(?:Jan(?:uary)?|Feb(?:ruary)?|Ma(?:r(?:ch)?|y)|Apr(?:il)?|Ju(?:(?:ly?)|(?:ne?))|Aug(?:ust)?|Oct(?:ober)?|(?:Sept|Nov|Dec)(?:ember)?) (?:\d{1,2},)?)?\d{4}
這不擔心檢測基於閏年或無論什麼無效日期。 @Bart讓我相信,這可能是最好的與本機JS比正則表達式。感謝@Tim也指出了對非捕獲括號的需求。
如果任何人有進一步的建議,我應該如何改進這個正則表達式請燒掉。
你想讓它在你的例子匹配任何什麼。 4?它應該匹配「Vol。」中的所有內容嗎? – 2009-11-11 16:06:09
哦,你真的需要匹配1600年的所有日期嗎?你是否真的需要在非閏年清除像2月30日或2月29日這樣的無效日期? – 2009-11-11 16:08:17
我希望它與2008年3月的例子4相匹配。我不必匹配1600年的所有日期或清除無效日期,但我喜歡這種功能的想法。 – 2009-11-11 20:07:35