2012-11-17 153 views
1

我有一個郵政編碼列表,它應該從我的發貨方式中排除。英國郵政編碼的正則表達式

假設我有排除Scilly IslesIsle of Man和其他幾個人。

對於上述2個區域有效交碼是IM1-IM9,IM86,IM87,IM89。如果是IM25或IM85,則無效。

我已經writtent以下表達式。但即使是這回是IM25或IM 85

var regex = new Regex("(PO3[0-9]|PO4[0-1]|GY[1-9]|JE[1-5]|IM[1-9]|TR[1-9])"); 

如果我傳遞IM85,我的表現應該返回false。對於IM1-IM9 ,, IM86,IM87,IM89,它應該返回true。

同樣的,TR POST代碼也。 TR1-TR27是一個有效的郵政編碼。如果我給TR28,它應該返回false。

我正在使用'|'分離多種模式。這是在1表達式中包含多個模式的正確方法。

+0

你期望什麼?什麼應該匹配,什麼不是?並且請舉一個你想測試的字符串的例子。 – stema

+0

@stema更新了我的問題。 – Naresh

+0

我編輯了你的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

回答

0

我改變了我的方法。

而不是去一個正在變得越來越複雜的正則表達式,我保存所有英國郵政編碼的排除在外代碼。

並且如果任何郵政編碼包含特定的向外代碼,則從列表中排除郵政編碼。 向外代碼是在此格式

XX-YYY 
XXX-YYY 
XXXX-YYY 

在所有上述格式中,X表示UK郵政編碼的向外代碼。

1

你期望什麼?什麼應該匹配,什麼不是?並且請舉一個你想測試的字符串的例子。

如果符合您對「IM25」,它將匹配,因爲你讓IM[1-9]在你的模式,所以你得到一個有效的部分匹配模式。如果你想避免這種情況(我不確定你想達到什麼目的),並且想要在第一個字母之後只允許一個數字,可以使用「字邊界」\b,並準確指定你想要的內容,像這樣:

(PO3[0-9]|PO4[0-1]|GY[1-9]|JE[1-5]|IM([1-9]|8[6-9])|TR([1-9]|2[0-7]))\b 

查看它here on Regexr

這將允許「IM」部分還6-9爲第二位時,有一個8之前。

更新

它仍然沒有清除任務的上下文是什麼。我假設你有一個有效的郵政編碼列表,可能會更好,你提取的郵政編碼或只是其第一部分(爲此,你最終可以使用正則表達式),並檢查它是否在列表中。

+0

感謝您回覆stema。 RegEx不應與IM16或IM 99匹配。它只能匹配IM1-IM9和IM86,IM87和IM89。 – Naresh

+0

我更新了我的答案。但請注意,該正則表達式是用於模式匹配而不是用於定義數字範圍。所以這將是困難的,因爲你需要將範圍定義爲模式。 – stema

+0

上下文是,我們不應該考慮針對特定送貨方式的少量郵政編碼(這是默認值)。他們有一些在exex名單上的地區和郵政編碼。所以我需要過濾排除列表中的郵政編碼。其中一些是澤西島 - 所有JE郵政編碼,Gurnsey - 所有GE郵政編碼,馬恩島 - 所有IM郵政編碼和更多。 – Naresh

0

我還是覺得你需要進一步澄清。作爲一個巨大的正則表達式的人,我想指出,爲了您的理智,應該嘗試將多位數範圍放入代碼端,而不是正則表達式端。但我個人喜歡用這種方式來玩正則表達式。正則表達式一次只讀取一個字符,所以它只能識別零到九。不是十,不二十八。如果你想允許下列:

28至347

然後,它變得相當複雜。 將其投入的話,你要允許:

 
    If Two Digits, allow 2-9 for the first digit, and: 
     If the first digit is a Two, then allow 8/9 for the second digit, 
     ElseIf the first Digit is 3-9, then allow 0-9 for the second digit 
    Elseif Three Digits, allow 1-3 for the first Digit, and: 
     If the first digit is a Three, then allow 0-4 for the second digit, and: 
     If the second digit is a Four, then allow 0-7 for the third digit, 
     ElseIf the second digit is 0-3, then allow 0-9 for the third digit. 
     ElseIf the first digit is 1/2, then allow 0-9 for both the Second and Third digits. 

然後與,你可以寫一個合適的正則表達式,像這樣,其搜索周邊的2對或3-字邊界或者非數字對。有了這種解決問題的類型,你應該能夠找出你的Regex問題。否則,讓我們更多地瞭解你想匹配什麼和不匹配:

(\b|\D)((2[89]|[3-9][0-9])(\b|\D)|(3(4[0-7]|[0-3][0-9])|[12][0-9][0-9])(\b|\D)) 
1

實際的檢驗是在維基百科網站...谷歌有答案;)http://en.wikipedia.org/wiki/Postcodes_in_the_United_Kingdom#Validation

(GIR 0AA)|(((A[BL]|B[ABDFHLNRSTX]?|C[ABFHMORTVW]|D[ADEGHLNTY]|E[HNX]?|F[KY]|G[LUY]?|H[ADGPRSUX]|I[GMPV]|JE|K[ATWY]|L[ADELNSU]?|M[EKL]?|N[EGNPRW]?|O[LX]|P[AEHLOR]|R[GHM]|S[AEGKLMNOPRSTY]?|T[ADFNQRSW]|UB|W[ADFNRSV]|YO|ZE)[1-9]?[0-9]|((E|N|NW|SE|SW|W)1|EC[1-4]|WC[12])[A-HJKMNPR-Y]|(SW|W)([2-9]|[1-9][0-9])|EC[1-9][0-9]) [0-9][ABD-HJLNP-UW-Z]{2}) 
+0

克雷格,我不是想驗證郵政編碼。我正在嘗試查找帖子代碼是否來自排除的郵政編碼列表。 – Naresh

相關問題