有一個字符串可以有一個或多個字符串範圍。 這些都是正確的字符串:爲什麼正則表達式沒有按預期工作?
""
"asd-asd"
"asd-asd;asd-asd"
"asd-asd;asd-asd;"
"asd-asd;asd-asd;asd0-asd1"
但字符串"asd0-asd1-asd2"
不應該是有效的。我寫了下面的正則表達式:
^(([^;-]+-[^;-]+);?)*$
而且如我所料不工作 - 這個正則表達式表明,該字符串匹配。爲什麼?
有一個字符串可以有一個或多個字符串範圍。 這些都是正確的字符串:爲什麼正則表達式沒有按預期工作?
""
"asd-asd"
"asd-asd;asd-asd"
"asd-asd;asd-asd;"
"asd-asd;asd-asd;asd0-asd1"
但字符串"asd0-asd1-asd2"
不應該是有效的。我寫了下面的正則表達式:
^(([^;-]+-[^;-]+);?)*$
而且如我所料不工作 - 這個正則表達式表明,該字符串匹配。爲什麼?
你需要讓你的正則表達式更復雜一點:
^([^;-]+-[^;-]+(;[^;-]+-[^;-]+)*)?$
說明:
^ # 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
(你也可以使用非捕獲組('(?:...)'而不是'(...)'),但是正則表達式足夠難以讀取 - 有些人認爲輕微的性能好處是不值得的。) –
它匹配因爲;?這使得;可選的。你正試圖用上下文來測試某些東西,正則表達式並不是最簡單的工具。
爲了避免使分號變爲可選,您可以使用(; | $)。
這將強制分號的匹配,除非您在字符串的末尾。
^(([^;-]+-[^;-]+)(;|$))*$
否。如果短劃線處於角色等級的最後一個位置,則該短劃線被視爲文字。所有的正則表達式引擎都像這樣。 –
好多了。 '[; $]'表示「匹配';'或'$'字符」。正則表達式元字符在字符類中失去其特殊含義。 –
這個版本怎麼樣?我這次實際測試了它。接縫好。 –
有輕微的添加到@Tim的答案。這個正則表達式不符合「asd-asd; asd-asd;」如果你使用.Net正則表達式庫。但是如果你添加一個';'作爲字符串結束之前的選項,它將覆蓋所有的情況。
^([^;-]+-[^;-]+(;[^;-]+-[^;-]+)*);?$
現在,這將匹配除了無效提供的所有有效字符串 - 「asd0-asd1-asd2」
+1,感謝您的注意!但是,現在它不再與空字符串匹配。 –
由於','是可選的,它可以匹配這兩個羣體 - 'asd0-ASD '和'1-asd2'。試圖找出一個乾淨的方式來解決這個問題。 –
會'';「'是一個有效的匹配?如果不是,爲什麼不呢? –