2013-10-15 84 views
2

有一個字符串可以有一個或多個字符串範圍。 這些都是正確的字符串:爲什麼正則表達式沒有按預期工作?

"" 
"asd-asd" 
"asd-asd;asd-asd" 
"asd-asd;asd-asd;" 
"asd-asd;asd-asd;asd0-asd1" 

但字符串"asd0-asd1-asd2"不應該是有效的。我寫了下面的正則表達式:

^(([^;-]+-[^;-]+);?)*$ 

而且如我所料不工作 - 這個正則表達式表明,該字符串匹配。爲什麼?

+0

由於','是可選的,它可以匹配這兩個羣體 - 'asd0-ASD '和'1-asd2'。試圖找出一個乾淨的方式來解決這個問題。 –

+0

會'';「'是一個有效的匹配?如果不是,爲什麼不呢? –

回答

4

你需要讓你的正則表達式更復雜一點:

^([^;-]+-[^;-]+(;[^;-]+-[^;-]+)*)?$ 

說明:

^    # Start of the string 
(    # Start of first group: 
[^;-]+-[^;-]+ # Match one "asd-asd" 
(    # Start of second group 
    ;    # Match ; 
    [^;-]+-[^;-]+ # Match another "asd-asd" 
)*    # Repeat the second group any number of times (including zero) 
)?    # Make the entire first group optional  
$    # End of string 
+0

(你也可以使用非捕獲組('(?:...)'而不是'(...)'),但是正則表達式足夠難以讀取 - 有些人認爲輕微的性能好處是不值得的。) –

1

它匹配因爲;?這使得;可選的。你正試圖用上下文來測試某些東西,正則表達式並不是最簡單的工具。

1

爲了避免使分號變爲可選,您可以使用(; | $)。
這將強制分號的匹配,除非您在字符串的末尾。

^(([^;-]+-[^;-]+)(;|$))*$ 
+0

否。如果短劃線處於角色等級的最後一個位置,則該短劃線被視爲文字。所有的正則表達式引擎都像這樣。 –

+0

好多了。 '[; $]'表示「匹配';'或'$'字符」。正則表達式元字符在字符類中失去其特殊含義。 –

+1

這個版本怎麼樣?我這次實際測試了它。接縫好。 –

0

有輕微的添加到@Tim的答案。這個正則表達式不符合「asd-asd; asd-asd;」如果你使用.Net正則表達式庫。但是如果你添加一個';'作爲字符串結束之前的選項,它將覆蓋所有的情況。

^([^;-]+-[^;-]+(;[^;-]+-[^;-]+)*);?$ 

現在,這將匹配除了無效提供的所有有效字符串 - 「asd0-asd1-asd2」

+0

+1,感謝您的注意!但是,現在它不再與空字符串匹配。 –

相關問題