2011-06-08 20 views
2

我需要驗證文本框用於數據輸入的這個格式 -經常用於連字符的鍵 - 值對的序列表達

「TeSt12-12TeSt,12Test-AB12,......」

這基本上是一個系列的鍵 - 值(鍵連字號的值)使用逗號分割(,)

Readlike

anyAlphaNumeric隨後連字符anyAlphaNumeric然後逗號和anyAlphaNumeric「從這裏可選的」,接着連字符anyAlphaNumeric然後逗號和任何AlphaNumeric followe由連字符anyAlphaNumeric d ...

這裏1S可以包括AZ,az,0-9 例子 - 11-11有效 111-111,是無效的(逗號應遵循的另一個鍵值集) 1-1,1-1有效 1是無效的(值連字符後失蹤) 1-1,111-111,11-11111,111-111111有效

+0

我試過,但不履行 - ([A-ZA- z0-9] *? - [A-Za-z0-9] *)+ – Neeraj 2011-06-08 12:34:51

+0

+1這是一個寫得很好的問題。規格很清晰,不像大多數其他「我需要一個正則表達式」 - 問題。 – 2011-06-08 12:40:32

+0

謝謝蒂姆,這是我第一次向任何論壇提出問題,我希望變得清晰明瞭! – Neeraj 2011-06-08 13:07:08

回答

5

好:

^  # Start of string 
\w+  # Match any alnum, 
-  # hyphen, 
\w+  # any alnum. 
(?:  # Try to match... 
,  # comma, 
\w+  # any alnum, 
-  # hyphen, 
\w+  # any alnum 
)*  # zero or more times. 
$  # Match end of string. 

或(作爲一個非詳細的正則表達式):

^\w+-\w+(?:,\w+-\w+)*$ 

請注意,\w也將匹配下劃線(並且在.NET環境中,也可能匹配Unicode字母和數字。如果您不想要,請使用[A-Za-z0-9]而不是\w

+0

完全按照我的需要工作:)謝謝蒂姆。 – Neeraj 2011-06-08 13:06:20

1

您需要了解一點的正則表達式的執行能夠建立這樣的事情,當涉及到重複(特別是逗號分隔列表)時,你需要經常做更多的事情。這應該做的伎倆。

([^-]+-[^,]+)(,[^-]+-[^,]+)* 

當你寫你正在創建一個非常簡單的解析器,將在貪婪地消耗由左到右字符的正則表達式。這對你編寫正則表達式有一定的限制。

這段代碼翻譯爲以下內容。

  • 匹配任意數量的非連字符的字符,隨後的實際連字符後跟任意數量的非逗號字符開頭的一組,創建一個組爲這場比賽
  • 下一組是有點intresting因爲只有當逗號分開時,匹配纔會成功。通過以逗號前面的第二組,只有在有逗號的情況下才會繼續使用正則表達式引擎。其餘的是完全一致的。

爲什麼每個字符類別只是分隔符是因爲貪婪的正則表達式引擎否則不會意識到在給定當前輸入時會做出決定。大多數正則表達式問題與正則表達式的貪婪性質的失敗理解有關(也有懶引擎,但它們較慢並且不是真正的標準正則表達式)

您可以像這樣重寫模式以變得更實用:

(?:(?<key>[^-]+)-(?<value>[^,]+))(?:,(?<key>[^-]+)-(?<value>[^,]+))* 
1
^[a-zA-Z0-9]+-[a-zA-Z0-9]+(,[a-zA-Z0-9]+-[a-zA-Z0-9]+)*$ 

或簡化

[^-]+-[^,]+(,[^-]+-[^,]+)* 

[^ - ]這意味着什麼,是不是 「 - 」

相關問題