2011-11-05 71 views
96

我是currentry編程的詞彙算法,用於檢查用戶是否正確輸入了單詞。我有以下情況: 該單詞的正確解決方案是「part1,part2」。 用戶應該可以輸入「part1」(答案1),「part2」(答案2)或「part1,part2」(答案3)。 我現在試着用以下的用戶給出的字符串匹配,自動生成,正則表達式:和/或正則表達式中的運算符

^(part1|part2)$ 

這隻回報回答1和2是正確的,而答案3將是錯誤的。我現在想知道是否有類似於|的操作符說「和/或」而不是「或者......」。 任何人都可以幫助我嗎?

+0

正則表達式可能不是我們的最佳解決方案。我會使用普通的字符串方法。 –

+1

這個問題很不明確。當你需要的只是一個字符串與一組合法字符串的精確字符串比較時,爲什麼使用模式匹配?除非你的正則表達式編譯器按照Perl的方式將替代方案優化爲O(1)trie結構,否則你應該對哈希成員進行測試。其他正則表達式引擎在這方面並不是很聰明。 – tchrist

回答

132

我會假設你要動態地構建一個正則表達式包含換句話說比第1部分和第2部分,以及希望以不重要。如果是這樣,你可以使用這樣的事情:

((^|,)(part1|part2|part3))+$ 

正匹配:

part1 
part2, part1 
part1, part2, part3 

否定匹配:

part1,   //with and without trailing spaces. 
part3, part2, 
otherpart1 
+0

請注意,「part1,part」1也是正數。哪個並不總是可取的 – dimaaan

+0

@dimaaan你錯過了你的報價? 「part1,part1」將會匹配,但「part1,part」不會。雖然你認爲這種解決方案沒有被這個解決方案所覆蓋,但是對於在檢查測試字符串是否由詞彙表中的單詞組成的情況下,OP的應用,我相信他確實想要一個正面的匹配,即使當一個單詞是重複。無論你有多少實例,這個詞仍然是詞彙的一部分。 – Mithon

2

不是正則表達式的專家,但你可以做^((part1|part2)|(part1, part2))$。用詞語:「第1部分或第2部分或兩者兼有」

9
'^(part1|part2|part1,part2)$' 

它工作嗎?

2

或者您可以使用此:

^(?:part[12]|(part)1,\12)$ 
5

這是否工作,而交替?

^((part)1(, \22)?)?(part2)?$ 

或爲什麼不是這個?

^((part)1(, (\22))?)?(\4)?$ 

的首部作品,第二爲所有,但part2所有條件(使用GNU sed的4.1.5)