2010-03-15 75 views
5

我想匹配SEDOL(正好爲7個字符:6個字母數字字符,然後1個數字的字符)正則表達式 - 僅匹配7個字符?

我正則表達式

([A-Z0-9]{6})[0-9]{1}

匹配正確的,但字符串大於7個字符是開始有效的比賽也匹配(如果你明白我的意思:))。例如:

B3KMJP4

匹配正確但這樣做:

B3KMJP4x

不應該匹配。

任何人都可以告訴我如何避免這種情況?在正則表達式(稱爲錨)的端部

+0

4答案完全一樣,現在就是一致性!謝謝大家。 – Simon 2010-03-15 15:42:25

+2

除了下面的(正確的)答案,你需要開始/結束錨點,你需要從你的第一個字符類中去掉空間('A A A 0'也與你的正則表達式匹配)。另外(爲了清楚起見)刪除不必要的'{1}'。 – 2010-03-15 15:46:36

+0

@Tim,我注意到所有四個答案都重複了你指出的兩個錯誤。你應該發佈你自己的答案,所以西蒙可以接受這個答案。 – 2010-03-15 15:52:42

回答

6

美元符號表示字符串的結束:

^([A-Z0-9]{6})\d$

我還添加了「^」在此表示串的開始的開始和防止匹配xB3KMJP4 我也簡化了原來的正則表達式。

順便說一下,根據維基百科,對於第一個字符,不使用元音。我不太確定這是一個規則還是一個慣例。

+0

根據以上Tim的評論,我刪除了空格(Cut'n'paste - 所有錯誤的78.3%的來源)。但是......對於SEDOL來說,實際驗證它是否是有效字符是有點損失的 - 「字母數字」可以在某些解釋下包含空格。我傾向於相信蒂姆的解釋是正確的。 – DVK 2010-03-15 16:07:08

+0

我相信這是正確的,我列出的數百個SEDOL中沒有一個以元音字符開頭。 – Simon 2010-03-17 10:02:01

5

您需要同時使用startendanchors這樣的:

^([A-Z 0-9]{6})[0-9]{1}$ 

這將匹配具有6個字母數字+字符空間,後面跟着一個數字的字符串。如果這樣的字符串被發現爲後綴前綴一個更大的字符串不匹配。

你也可以擺脫{1},因爲[0-9]自己匹配一個數字。

另外\d代表一位數字。所以,你可以縮短你的正則表達式如下:

^([A-Z \d]{6})\d$ 
+0

看起來「A-Z \ d」看起來不太可讀,並且可以維護A-Z0-9。 – Aye 2010-03-15 15:56:33

+0

+1用於注意char類中的空間。 – Webdev 2010-03-15 16:00:48

3
^([A-Z\d]{6})\d$ 
  • 使用^字符串開始
  • $字符串的結束
  • 刪除多餘的空間,只注意到一個
  • 已交換out 0-9 with \ d
  • 刪除{1},因爲這是多餘的
3

你忘記了正則表達式匹配字符串中的任何地方。要修復它,請試試這個。

^([A-Z 0-9]{6})[0-9]{1}$ 

^表示匹配字符串的開頭,$表示匹配字符串的結尾。