2012-05-18 48 views
0

我在寫一個正則表達式,其中的字符串可以是2-3個字符。 第一個字符必須是A和H(首都)之間的字母。這和性格所應遵循一個數字1和12 之間我寫匹配字母后跟特定數字範圍

[A-H]{1}[1-12]{1,2} 

這是很好,當我科印A12而不是當我科印A6

請建議。

回答

3

,因爲它是以字符之間的範圍內實現的,您可以不指定範圍的這樣的數字,所以[1-12]相當於[12],這將只匹配無論是12。相反,嘗試以下操作:

[A-H](?:1[012]|[1-9]) 

這裏有一個解釋:

[A-H]  # one letter from A to H 
(?:   # start non-capturing group 
    1[012]  # 1 followed by 0, 1, or 2 (10, 11, 12) 
    |   # OR 
    [1-9]  # one digit from 1 to 9 
)   # end non-capturing group 

注意,{1}[A-H]後,原來的正則表達式是不必要的,[A-H]{1}[A-H]是等價的。

你可能要考慮在正則表達式中添加錨,否則你也會得到一個像A20這樣的字符串的部分匹配。如果你試圖匹配整個字符串,那麼你應該使用下列內容:

​​

如果它是一個較大的文本中,你可以使用單詞邊界,而不是:

\b[A-H](?:1[012]|[1-9])\b 
+0

謝謝。在這種情況下,A12只是部分匹配。只有A1匹配。 http://rubular.com/r/EQmL27ZTAH – Ank

+0

@Ankur - 我只是改變了交替的順序,所以它現在應該可以正常工作。你可能要考慮在正則表達式中添加錨點,否則你會得到像A20這樣的字符串的部分匹配。如果你想匹配整個字符串,那麼你應該使用'\ A [AH](?: 1 [012] | [1-9])\ z',或者如果它在更大的文本字內, '\ b [AH](?: 1 [012] | [1-9])\ b' –

+0

謝謝..有道理..現在可以工作。 – Ank

1

在這裏你去:

^[A-H]([1-9]|1[0-2])$ 

無需爲您的問題中的{1}。

正則表達式使用^和$來表示錨定,這意味着它可以是行中唯一的東西。 它將不匹配A60例如

+0

這是過分寬容,因爲它會允許(例如)'A90'或'A22'。 – Phrogz

+0

@Progrog謝謝,更新了正則表達式 – buckley