2013-07-17 50 views
0

我正在使用Asp.Net RegularExpressionValidator來驗證電話號碼。如何結合這些正則表達式的要求?

的檢查是很基本的 - 一個數字可以是長度爲10或11個字符,所有的數字和啓動01或02

這裏的正則表達式:

^0[12]\d{8,9}$ 

不過,我最近開始與第三方合作,執行更嚴格的規則。在我看來,這是一個糟糕的主意 - 部分原因是他們甚至不公佈這些規則,而且他們可能會因所有合作伙伴的變化而受到影響。然而...

我現在需要將他們的添加到我的正則表達式,但我不知道從哪裏開始。

他們目前在OR中使用2個單獨的正則表達式,但是如果可能的話,我想在1中做到這一點。

額外的語法應該可以確保10位電話號碼也遵守這些附加規則 - 這裏是他們的10位數字語法。

"^01(204|208|254|276|297|298|363|364|384|386|404|420|460|461|480|488|524|527|562|566|606|629|635|647|659|695|726|744|750|768|827|837|884|900|905|935|946|949|963|995)[0-9]{5}$ 

有關如何實現此目的的任何想法?

+0

您是否檢查輸入是否符合'regex1' ** AND **'regex2'或'regex1' **或**'regex2'? – HamZa

+0

它只能是10或11位數字 – dotnetnoob

+0

您沒有得到我的問題。如果它只能是10或11個數字,那麼'[0-9] {10,11}'就可以完成這項工作。我在問你怎麼檢查這兩個正則表達式?你在if語句中使用'and'還是'or'? – HamZa

回答

1

你可以在正則表達式本身具有或合併其中:

^(?:01(204|208|254|276|297|298|363|364|384|386|404|420|460|461|480|488|524|527|562|566|606|629|635|647|659|695|726|744|750|768|827|837|884|900|905|935|946|949|963|995)\d{5}|0[12]\d{9})$

編輯11位的正則表達式。

2

免責聲明:這個答案是基於邏輯隨後this answer展示「虛擬」的要求(我們應該反正下降)。

讓我解釋一下什麼是要去:
^0[12]\d{8,9}$這是怎麼回事?

  • ^:匹配開始線
  • 0的:匹配0
  • [12]:匹配12
  • \d{8,9}:匹配數字8或9倍
  • $:線
  • 的匹配端

^01(204|20...3|995)[0-9]{5}$這個大正則表達式做什麼?

  • ^:配襯
  • 的開始
  • 01:匹配01
  • (204|20...3|995):符合特定3位數組合
  • [0-9]{5}:匹配一個數字5次
  • $:配襯

那麼,如果我們在OR語句合併這兩個結束了嗎?

^ 
    (?: 
     01(204|20...3|995)[0-9]{5} 
    ) 
    | 
    (?: 
     0[12]\d{8,9} 
    ) 
$ 

我會告訴你爲什麼它沒有意義。
0[12]\d{8,9}匹配多少位數? 10或11對不對?
現在有多少位數的其他正則表達式匹配?

01(204|20...3|995)[0-9]{5} 
^^ ^-----\/-----^ ^--\/--^ 
2 + 3  + 5  = 10 

現在,如果我們比較2個正則表達式。很明顯,^0[12]\d{8,9}$將匹配對其他正則表達式有效的所有數字。那麼爲什麼在這個世界上你會結合這兩個?

爲了使問題更簡單,假設您有regex1:abc,regex2:[a-z]+。你想要什麼就像abc|[a-z]+,但這是沒有意義的,因爲[a-z]+將匹配abc,所以我們可以搭乘abc

在旁註中,\ddoes match more比你想象的有些語言。你的最終正則表達式應該是^0[12][0-9]{8,9}$

+1

HamZa - 你沒有注意到最終的正則表達式已經改變,所以{8,9}變成了{9}。我確實接受了你對\ d的評論,並在最終的正則表達式中用[0-9]代替。 – dotnetnoob

+0

我確實看到它,但我非常專注於OR部分,我完全忽略了它。我確實失敗了:P – HamZa