2012-06-22 46 views

回答

1

確認你的最大的問題是[IN]之初,只匹配一個字母,只有當它的IN。如果您想匹配任意字母中的兩個,請使用[A-Z]{2}

修復該問題後,您的正則表達式仍然只會匹配RX-E。這是因爲[A-Z]{0,2}?開始嘗試不消耗任何東西,這要歸功於不情願的量詞,{0,2}?。然後\d{0,14}匹配零個數字,並且[A-Z]{0,1}貪婪地消耗E

如果要準確匹配2個字母和14個數字,請使用[A-Z]{2}\d{14}。而且,由於您正在驗證字符串,因此您應該使用末尾錨點$結束正則表達式。結果:

^[A-Z]{2}-[A-Z]{2}\d{14}[A-Z]$ 

...或者,作爲一個Java字符串字面量:

"^[A-Z]{2}-[A-Z]{2}\\d{14}[A-Z]$" 

由於@nhahtdh觀察,你真的沒有使用錨,如果你使用的是Java的matches()方法應用正則表達式,但我建議無論如何這樣做。它更好地傳達你的意圖,並且它使得正則表達式可移植,以防你必須在不同的風格/上下文中使用它。

編輯:如果前兩個字符應該是完全IN,這將是

^IN-[A-Z]{2}\d{14}[A-Z]$ 
+0

感謝Alan,[AZ] {2}在開始時匹配任何兩個字符,有沒有辦法將第一個字符限制爲'I',第二個'N 「? –

+0

看我的編輯。但是如果它應該以'IN'開始,爲什麼你提供了一個以'RX'開頭的示例? –

1

不知道你在你的當前正則表達式開始時想要做什麼。

"^[A-Z]{2}-[A-Z]{2}\\d{14}[A-Z]$" 

上面的正則表達式將嚴格匹配您指定的輸入字符串。如果使用matches功能,則可以省略^$

由於您需要確切的重複次數,因此只應將其指定爲{<number>}{<number>,<number>}用於可變數量的重複。並且?指定在可能或可能會出現而不是之前的令牌 - 如果它必須在那裏,則指定?不正確。

0

這應該解決您的問題。退房的有效性here

^[A-Z]{2}-[A-Z]{2}[0-9]{14}[A-Z]$ 
1

簡單地翻譯您的要求爲Java正則表達式:

"^[A-Z]{2}-[A-Z]{2}\\d{14}[A-Z]$" 

這將允許你使用:

if (!input.matches("^[A-Z]{2}-[A-Z]{2}\\d{14}[A-Z]$")) { 
    // do something because input is invalid 
} 
+0

nhahtdh嗨,波希米亞,此正則表達式的工作,但我需要前兩個字符restict到「IN」 ,我改變了正則表達式爲^ [IN] {2} - [AZ] {2} \\ d {14} [AZ] $,但即使對'NI'也返回true? –

0
^([A-Z]{2,2}[-]{1,1}[A-Z]{2,2}[0-9]{14,14}[A-Z]{1,1}){1,1}$ 
+1

這是什麼'{1,1}','{2,2}'的東西?如果你想要消耗2或14的東西,那麼你只需要使用「{2}」或「{14}」。 (實際上,如果某些口味將長版本視爲語法錯誤,我不會感到驚訝。)至於'{1,1}',不要打擾它的縮短,只是擺脫它。你所做的只是告訴正則表達式引擎消耗前一個原子之一,這正是它要做的。 –

+0

指定的範圍{min,max}我從egrep中得到了這個,例如{0,1}等於?。但我明白現在已經過時了.Thx糾正我 –

1

^[A-Z]{2}-[A-Z]{2}\\d{14}[A-Z]$

這應該解決你的目的。您可以從here

相關問題