2010-05-10 25 views
0

我需要編寫一個正則表達式匹配像「abc」,「ab」,「ac」,「bc」,「a」,「b」,「c」 。順序很重要,它不應該匹配同一部分的多個外觀。正則表達式與所有可選部分,但至少需要一個

a?b?c?幾乎可以做到這一點。除了它也匹配空字符串。有沒有什麼辦法來防止它匹配空字符串或可能以不同的方式爲任務編寫正則表達式。

回答

2

要使用正則表達式純做到這一點你將不得不將其業務拓展到其所有可能性:

ab?c?|a?bc?|a?b?c 

如果你向前看符號可以確保該字符串非空。或者,在將字符串傳遞給表達式之前,您可以驗證該字符串的長度至少爲1,具體取決於您選擇的語言。

例如一個.NET前瞻可能是這樣的:

^(?=[abc])a?b?c?$ 

或者你可以匹配之前只是測試你的字符串的長度:

if (YourString.Length == 1) { 
    // matching code goes here, using the expression a?b?c? 
} 
+0

(?= [abc])a?b?c?或甚至更好(?=(a | b | c))a?b?c? (因爲我真正的a,b,c不是字母,而是更長的結構)似乎是完美的。謝謝! – 2010-05-10 15:22:14

0

你可以寫下所有的排列(這是一種痛苦)或所有可能性,哪些字母不被遺漏(ab?c?|a?bc?|a?b?c),這是一種痛苦。

+0

是的,我知道我可以做到這一點,但這是我想避免在這裏。 – 2010-05-10 15:10:06

4
^(?=.)a?b?c?$ 

這將檢查是否有至少有一個人物向前看,並會匹配你的正則表達式。

+0

謝謝。這完全符合前提條件,即它是完整的字符串而不是子字符串。如果我刪除^和$,它會與其他符號一樣多次匹配。無論如何,這是非常接近的,我會給你一個,但Weblog有一個更接近的解決方案。謝謝! – 2010-05-10 15:20:53

0

嘗試將所有問題的所有功能都打包到一個正則表達式中毫無意義。最好的解決方案是編寫明顯的正則表達式,並添加一個零長度的檢查。當你絕對必須使用正則表達式時,你應該更加聰明 - 例如,如果你必須與一個不可更改的API進行交互,該API只接受一個正則表達式,而沒有其他更多。

+0

問題不僅是零長度,而且它基本上匹配每個不匹配符號之間的所有「虛無」。所以對於像「zxvnm」這樣的字符串,將會有5個匹配。 – 2010-05-10 15:24:09

相關問題