2011-09-26 32 views
1

我需要在輸入時驗證英國電話號碼,並在顯示時以正確的格式顯示。RegEx適用於英國地區代碼。

我已經看到了幾個深不可測的正則表達式例子,但他們沒有得到所有英國數字的正確格式或拒絕一些有效格式(或允許一些無效格式)。

我找到了所需格式的列表,它看起來正確(而且比我最初設想的要複雜得多),但是如何將其變爲「簡單」RegEx模式?

NSN長度:

  • 10大多;
  • 9對於某些01xxx區域;
  • 9對於所有0500,一些0800;
  • 7對於兩個特殊的08xx號碼。

格式:

NSN = 10:

  • (01xxxx)爲XXXXX
  • (01xxx)XXXXXX
  • (01x1)XXX XXXX
  • (011X)XXX XXXX
  • (02x)xxxx xxxx
  • 0 3XX XXX XXXX
  • 055 XXXX XXXX
  • 056 XXXX XXXX
  • 070 XXXX XXXX
  • 07xxx XXXXXX
  • 0800 XXX XXXX
  • 山東省實驗中學XXX XXXX
  • 09xx XXX XXXX

NSN = 9:

  • (016977)XXXX
  • (01xxx)爲XXXXX
  • 0500 XXXXXX
  • 0800 XXXXXX

NSN = 7:

注:

  • 01範圍可以具有NSN如10或9
  • 0800範圍可以具有NSN爲10,9或7
  • 0845範圍可以具有NSN 10或7。

回答

0

那麼最簡單的(雖然不是最優雅的)解決方案將簡單地連接你的列表和|運營商如:

\(01\d\{4}\) \d{5}|\(01\d{3}) \d{6}|(01\d1) \d{3} \d{4}|0800 1111 

關於這樣做的好處是,如果你寫從列表中短期轉換腳本,你必須在正則表達式,然後如果你在未來的一個新的列表,你可以重新生成的正則表達式,而不不得不做複雜的調試。

儘管可以通過找出常見的子表達式來優化它,但如果您發現性能問題,我只會這樣做。在現代機器上使用體面的RE引擎是不太可能的。

0

把你的有效模式的列表,並執行這些步驟:

  • ^在該行的開始,$在該行的末尾。
  • 在每個括號之前加一個反斜槓。
  • 將xxxx替換爲[0-9]{n}其中n是位數。
  • 加入每行|

您可以手動執行這些步驟,也可以編寫程序來執行這些步驟併爲您生成正則表達式。

例如,如果你有這些模式:

  • (01xxxx)爲XXXXX
  • (01xxx)XXXXXX
  • (01x1)XXX XXXX

那麼正則表達式將是這樣的:

^\(01[0-9]{4}\) [0-9]{5}$|^\(01[0-9]{3}\) [0-9]{6}$|^\(01[0-9]1\) [0-9]{3} [0-9]{4}$ 

您可能還會喜歡通過在它們之後添加問號來使空間可選。

相關問題