2014-01-28 53 views
1

我期待一個正則表達式與匹配任一 2 [0-9]重複(再一些其它圖案)REGEX中繼器 「或者」 操作員

[0-9]{2}[A-z]{4} 

OR 6 [0-9]重複(再一些其它圖案)

[0-9]{6}[A-z]{4} 

以下是太包容:

[0-9]{2,6}[A-z]{4} 

問題

有沒有一種方法可以指定2個或6個重複?

+2

**請勿在REGEX中使用[A-Z] **要匹配任何ASCII字母,大寫或小寫,請使用[[A-Za-z]]。 '[A-Z]'匹配所有那些,*加上*代碼點恰好位於'Z'和'a'之間的幾個標點符號。 –

+0

@AlanMoore謝謝你。正如我在下面的評論中提到的那樣,'[A-z]'不是我正在使用的正則表達式的一部分,我只是用它作爲我冗長的正則表達式的其他部分的表達,以便不會減損我的問題。 (謝謝你的教學時間,但是(沒有諷刺,我實際上是新的正則表達式,並沒有意識到這一點)。 –

回答

5

可以使用或|這樣內的非-capturing組:

(?:[0-9]{2}|[0-9]{6})[A-z]{4} 

注意,使用[A-z]不僅包括大寫和小寫字母,也[\],^,_',它們位於ASCII碼點中的Za之間。正如@AlanMoore在他的評論中指出的那樣,使用[A-Za-z]作爲信函。

+0

-1代表'[A-z]'。 (請參閱我的問題。) –

+1

@AlanMoore我假設OP有意這樣做,但我想我可以添加一個筆記。 – Vache

+0

最初的'?:'是什麼? – xbonez

3

這應該工作

(?:[0-9]{2}|[0-9]{6})[a-zA-Z]{4} 

你有一些測試情況下,我可以驗證它。

  • 12asdf - 通過
  • 123456asdf - 通過
  • 1234asdf - 失敗

但是,如果你沒有正則表達式的開始錨定到一個字(\ b)或邊界線(^),1234asdf將具有34asdf作爲部分匹配。

因此,要麼

\b(?:[0-9]{2}|[0-9]{6})[a-zA-Z]{4} 

^(?:[0-9]{2}|[0-9]{6})[a-zA-Z]{4} 

作爲正則表達式的快速綱要改變

  • (?:)創建一個非捕獲組
  • |選擇變質劑之間[0-9] {2}和[0-9] {6}
  • ^相匹配的線
  • $的開始的線
  • \b的端部相匹配的字邊界
  • [a-zA-Z]是匹配用於代替[A-z],因爲它很可能意圖是什麼(所有字母字符,不區分大小寫)

你也可以用\d這是任何數字速記取代你[0-9]秒。我能想到的最好的方式來糾正這一點,不明白的是部分匹配如下

(?:\b|^)(?:\d{2}|\d{6})[a-zA-Z]{4}(?:\b|$) 
+0

-1代表'[A-z]'。 (請參閱我的問題。) –

+1

@AlanMoore,我從用戶問題中複製了「其他模式」。你是誰來判斷他那部分正則表達式的有效性?給OP和我們留下評論,指出潛在的錯誤,但對它的低估僅僅是粗魯。 – CaffGeek

+0

我是誰?我是那個知道'[A-Z]'總是*錯誤的人(顯然是唯一一個)。也許我反應過度了,但是我有些震驚地看到有三個人似乎對盲目重複這樣一個公然的,初學者的錯誤的正則表達式有所瞭解。 –

2

並不明顯,但肯定的:

(?:\d{2}|\d{6}) 
+0

'\ d'不保證與[0-9]'相同。 Unicode是狂野而毛茸茸的! –

3

經典的方法是:

(?:[0-9]{2}|[0-9]{6})[A-z]{4} 

[字面上[0-9]{2} OR [0-9]{6}]

但是你也可以使用這一個,這應該是比上面一個小更高效的用更少的潛在回溯:

[0-9]{2}(?:[0-9]{4})?[A-z]{4} 

[這裏,[0-9]{2}然後潛在其他4 [0-9]這使得總在所要求的條件6 [0-9]]


你可能不知道,[A-z]匹配的字母和一些其他字符,但它實際上做。

範圍[A-z]有效等價於:

[A-Z\[\\\]^_`a-z] 

注意,相匹配的附加的字符是:

[ \ ]^_ ` 

[含自願分離空間,但不是字符的一部分]

這是因爲這些字符位於unicode表中的塊字母和小寫字母之間。

+0

當然,根據您的語言和您使用的函數,您可能需要使用錨來強制正則表達式應用於要測試的完整字符串。 – Jerry

+0

-1代表'[A-z]'。 (見我的評論在這個問題下。) –

+0

@AlanMoore我只是解決了OP正面臨的實際問題,並假定他們知道'[Az]'實際上匹配了什麼(在許多情況下,OP是正確的,並有其他原因,在其他,OP是錯誤的,不知道它...)。如果你堅持挑剔,這不是問題,我可以將其添加到我的答案。 – Jerry