2013-05-18 104 views
3

我使用簡單的indx使用JS正則表達式。 他們說,%日期%變量是一樣的正則表達式JS註冊月份日期

(((J(anuary|uly|une))|February|(M(arch|ay))|(A(pril|ugust))|((Sept|Nov|Dec)ember)|October)| 
    (jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec))[.,]{0,1}[\s]{0,1}[0-9]{1,2}[.,]{0,1}[\s]{0,1}(19|20|)\d\d| 
    (0[1-9]|[12][0-9]|3[01]|[1-9])(th|rd|st|nd){0,1}[\s]{0,1}(day\s){0,1}(of\s){0,1}(((J(anuary|uly|une))|February| 
    (M(arch|ay))|(A(pril|ugust))|((Sept|Nov|Dec)ember)|October)|(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec))[.,]{0,2} 
    [\s]{0,1}(19|20|)\d\d| (0[1-9]|1[012]|[1-9])[- /.](0[1-9]|[12][0-9]|3[01]|[1-9])[- /.](19|20|)\d\d|(0[1-9]| 
    [12][0-9]|3[01]|[1-9])[- /.](0[1-9]|1[012]|[1-9])[- /.](19|20|)\d\d|(19|20|)\d\d[- /.](0[1-9]|1[012]|[1-9])[- 
    /.](0[1-9]|[12][0-9]|3[01]|[1-9]) 

但是,這並不工作。 我需要把它捕獲的數字或數字與一個月名 日期,這是我到目前爲止,但似乎無法弄清楚如何我捕獲5 2012年5月

對於nummeric日期

(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d|(19|20)\d\d[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01]) 

月分名稱(但不完全。應該是即5 2012年5月)

(?<Month>((Jan(uary)?)|(Feb(ruary)?)|(Mar(ch)?)|(Apr(il)?)|(May)|(June?)|(July?)|(Aug(ust)?)|(Sep(t(ember)?)?)|(Oct(ober)?)|(Nov(ember)?)|(Dec(ember)?)))\s*[ ,-]\s*(?<Date>(([12][0-9]) 

任何人可以建議

+0

你確定Regex是唯一的方法嗎? –

+0

上次我在JS中編寫了一個日期解析器,我用我的正則表達式在月份中抽出了一個單詞,並使用了一個將月份名稱作爲返回月份編號的地圖的索引的地圖。我把這個月份的名字用規範形式(小寫)和全名和短名稱。 –

+0

是的。該手冊僅說明js正則表達式。 (或變量,但不能這樣做,因爲它使用不同的語言) – user2397365

回答

2

這裏是一個(更容易理解,我希望)正則表達式是象你們那樣的情況下工作:

var monthsWords = "(jan(uary)?|feb(ruary)?|mar(ch)?|apr(il)?|may|june?|july?|aug(ust)?|sep(tember)?|oct(ober)?|nov(ember)?|dec(ember)?)"; 
var monthsNos = "((0?[1-9])|1[0-2])"; 
var months = "(("+monthsWords+")|("+monthsNos+"))"; 
var days = "((0?[1-9])|([12][0-9])|(3[0-1]))"; 
var years = "\\d{4}"; 
var separator = "[. /-]"; 
var pattern = months + separator + days + separator + years; 
var regexp = new RegExp(pattern, "i"); 
regexp.compile(regexp); 
var result=regexp.test("May 4 2012"); 

當然,如果你需要更多的靈活性(例如反向次序幾個月和幾天)你需要修改模式。此外,我假設任何四位數字的字符串是有效年份,您可能還需要修改它。請注意使用「i」標誌使模式不區分大小寫。