2010-06-15 73 views
2

我試圖構造一個正則表達式來組合範圍內的有效部分和/或序列號。JavaScript正則表達式:複雜的輸入驗證

有效號碼是一個兩個α,三位數圖案或/ [AZ] {2} \ d {3}/

i.e. aa123 or ZZ443 etc... 

有效的序列號是一個五位圖案或/ \ d {5}/

13245 or 31234 and so on. 

這部分不是問題。我想組合和範圍也是有效的:

12345, ab123,ab234-ab245, 12346 - 12349 - 最終目標。範圍和/或系列部分和/或序列號的任意組合。請注意,在指定範圍或系列中的逗號後,空格是可選的。需要注意的是各種零件號對範圍兩側的兩個相同的字母組合(即AB 123 - AB 239)

我一直在此表達了兩天,現在摔跤,和避風港」我們走來了什麼比這更好:

/^(?:[A-z]{2}\d{3}[, ]*)|(?:\d{5}[, ]*)|(?:([A-z]{2})\d{3} ?- ?\4\d{3}[, ]*)|(?:\d{5} ?- ?\d{5}[, ]*)$/ 

...

我正則表達式福較弱。

+0

我不認爲你可以用正則表達式檢查連字符兩邊的兩個字母組合是否相同,但我不是正則表達式專家。 – 2010-06-16 00:07:44

+0

我不認爲匹配範圍是正確的。例如,嘗試查找代碼來驗證正則表達式中的IP地址。我從來沒有見過這樣的解決方案(檢查小於255的數字似乎是不可能的。) – Shawn 2010-06-16 21:47:24

回答

1

首先,[A-z]是錯誤的。除字母外,它還將匹配方括號,反斜線,插入符號,下劃線或反引號 - 位於ASCII字符集中大寫字母和小寫字母之間的所有字符。您應該使用[A-Za-z][A-Z]以及不區分大小寫的選項。

要匹配一個序列號或一定範圍的序列號,這樣做:

/\d{5}(?:\s*-\s*\d{5})?/ 

...和部件號:

/([A-Z]{2})\d{3}(?:\s*-\s*\1\d{3})?/i 

在你的正則表達式,你使用\4 ,但那是錯誤的。它可能是第四個組別,它們與第一個零件號碼中的字母相匹配,但它只是第一個捕獲組,因此您應該使用\1

把它們一起配合整個系列,你有

/(?:\b(?:\d{5}(?:\s*-\s*\d{5})?|([A-Z]{2})\d{3}(?:\s*-\s*\1\d{3})?)(?:,\s*)?)+/i 

逗號必須是可選的,但是這意味着正則表達式錯誤可能像匹配或1234512345一個12345ab123序列。不太可能發生,我添加了字邊界(\b)來覆蓋它。兩個串行/部件號/範圍之間必須至少有一個非單詞字符,並且(?:,\s*)?表示只能是逗號和可選空白。你的[, ]*將允許任何數量的空格和/或逗號,或者什麼也不做。

+0

太棒了!最初我沒有讓這些組織不捕獲,並且後來忘記將反向引用更改爲\ 1。我真的很喜歡你在這裏想的方式 - 將一個零件/序列與一個可選範圍相匹配,而不是我正在向下的零件/序列/零件範圍/系列範圍路徑。 +2到Awesomeness。 – 2010-06-17 15:18:51

+0

我的確需要將字符串的開始和結尾添加到正則表達式才能正常工作,但仍然很棒。再次感謝。 – 2010-06-18 14:07:04

1

你可能不想用正則表達式來完成這一切。如果你只是有一個逗號分隔的部分/序列號的,可任選有範圍的列表中,這可能是更容易:

split input on commas 
for each input: 
    if there is a dash: 
     split on a dash, strip each element to remove whitespace 
     make sure each side is a part or a serial number (can use 2 regexes here) 
     if they're part numbers, make sure they start w/ the same two letters 
    else: 
     strip to remove whitespace, make sure is a valid part or serial number 

如果一切都通過,則輸入是正確的。

+0

hm ...絕對是一個選項。 – 2010-06-15 23:38:41

+1

javascript可以做字符串拆分,所以不應該太糟糕。另外代碼將更具可讀性,並且如果您的需求因某種原因而發生更改,修改代碼應該比正則表達式更容易。 – Claudiu 2010-06-15 23:41:10