2011-12-14 47 views
0

我有一個棘手的正則表達式,我需要實現,我不是一個很好的正則表達式人。帶分隔符和長度的正則表達式

規則是:

2字母數字字符,隨後是.-接着用2個字母數字字符。

它不能爲空,它不能只有一對(即01)該字符串最多可以有10組2個數字。即01.02.03.04.05.06.10,分隔符一旦被選擇就不能改變。和表達不能用定界符結尾

實例是:

有效:

a1.02.b3.00 
01-02-aa-04 
01.02 
aa.bb 
ac.21 

無效:

aa.01-02 
123.2.10 
01 
a1. 

想法?

+0

1.什麼味道的正則表達式? 2.爲什麼必須用正則表達式來完成? – 2011-12-14 15:04:57

+3

這聽起來像作業... – Giann 2011-12-14 15:07:20

+0

@所有...我正在使用[RegularExpression()]修飾符MVC3模型對象的屬性。這對用戶來說太棒了,因爲驗證應用於使用屬性的任何地方 – MikeTWebb 2011-12-14 15:17:56

回答

3

EY,GUYS!?

爲什麼讓事情比他們要更復雜?

^[a-z0-9]{2}([.-])([a-z0-9]{2}\1){0,8}[a-z0-9]{2}$ 

根據你在哪裏使用這個正則表達式,你有幾個關於匹配大寫字母的選項。


如果你正在寫的正則表達式爲/regular-expression/:使用/i作爲改性劑(不區分大小寫的匹配)。

如果您在.NET下使用正則表達式(如您所注意到的),則使用IgnoreCase選項。在此正則表達式的型動物份


說明

  • ^[a-z0-9]{2}字符串必須匹配\w(即[A-z0-9A-Z])
  • 兩個字符開始([.-])下一個字符必須是點或連字符,從現在起\1將包含此值
  • ([a-z0-9]{2}\1){0,8}我們希望零到8對的2 *字母數字字符 + 使用的第一個分隔符
  • [a-z0-9]{2}該字符串必須以兩個字母數字字符結尾。
-1

這可能工作:

^[\w\d][\w\d](?:([.-])[\w\d][\w\d])(?:\1[\w\d][\w\d]){,8}

0

這將是這樣的:

[a-z0-9]{2}\([.][a-z0-9]{2}\){1,9}|[a-z0-9]{2}\([-][a-z0-9]{2}\){1,9} 

{2}表示正好2

{1,9}是指至少一個,和最多9

\(something \)is a grouping

A | B指匹配A或B

+0

@smendola ...感謝上述定義的解釋。太好了! Tha對我對RegEx – MikeTWebb 2011-12-14 15:20:01

1

我嘗試這樣做:

^[[:alnum:]]{2}([-.])[[:alnum:]]{2}(?:\1[[:alnum:]]{2}){0,8}$ 

您需要在兩個錨端,使其整個字符串相匹配。根據區域設置,使用[[:alnum:]]可以匹配所有字母數字。如果你只想要我們用英文考慮的那些,不管語言環境如何,你都會想在每種情況下使用[A-Za-z0-9]

最棘手的部分是反向引用\1,它確保您始終使用相同的分隔符---它指的是([-.])中的捕獲括號。因此,如果您再有0-8個分隔符重複,然後是2個字母數字,分隔符總是相同。

我在Perl中試過這個,它傳遞了一些我向它扔的測試字符串。如果您使用其他語言/圖書館,您的里程可能會有所不同。

0

可能...

([\p{L}0-9]{2})(\.|-)([\p{L}0-9]{2}) 

這種處理Unicode字母太多,但我不知道這是你需要正確的作爲你的頭兩行中的「有效」組包含有<項目2個字符號> <> < 2個字符號> <> < 2個字符號> <。> < 2的α-NUM>,而不是你的問題,你是在哪裏尋找< 2的α-NUM> <> < 2的α-NUM>

希望這有助於格式。