2009-12-10 71 views
1

我有一句話(由空格分隔的單詞)。帶'包含'列表和'排除'列表的正則表達式

然後我有兩個詞組列表(全部或部分詞,即不包含空格):一個是'包含'列表,另一個是'排除'列表。

一個匹配的句子將包含'包含'列表中的所有短語(重疊是好的,不區分大小寫),而'排除'列表中沒有任何短語。

如何測試句子是否符合規則?謝謝。

句子= This yammy Flybe catalog is sticky

包含列表= catflytic

排除列表= vegpotyam

測試失敗,因爲,雖然所有的 '包括' 短語是在句子,其中一個「排除」短語(yam)確實應用耳。將單詞yammy更改爲yummy並且測試應通過。

P.S.目前在SQL中使用關係分解實現來實現這一點,當SQL數據庫中的數據已準備就緒時,似乎已經進行了優化。現在我有一個來自外部源的數據結構。我想我可以傳入分隔字符串,分割成表格行等,但我想調查其他選項。所以如果不是正則表達式那麼是什麼?

+0

我建議爲增加的新問題,打開一個單獨的問題(確保它看起來不像重複),你明確地要求其他方法,然後在這個線程中提出。人們不太可能在編輯過程中發現添加的新問題......您的例子非常好,順便提一下,並且適用於所提議的解決方案。 – Abel 2009-12-10 14:26:57

回答

4

雖然我認爲這對於正則表達式來說不是一件好事,但當正則表達式是您選擇的技術時,您可以考慮沿着這些線(反面向前看和積極向前看,固定在開頭) :

^(?=.*include1)(?=.*include2)(?=.*...)(?!.*(?:exclude1|exclude2|...)) 

確保在將各個句子添加到include或exclude表達式之前使用Regex.Escape。正則表達式的工作原理如下:

  • 如果include1是匹配的字符串,它成功了,如果沒有,失敗和
  • 如果include2是匹配的字符串,它成功了,如果沒有,失敗和
  • 如果includeX是匹配的字符串,它成功了,如果沒有,失敗和
  • 如果exclude1是匹配的字符串,它失敗或
  • 如果exclude2是匹配的字符串,它失敗或
  • 如果excludeX位於匹配字符串中,則失敗。

換句話說:所有包含句子都必須在(以任意順序),所有排除句子都必須排除。

注意:這種類型的正則表達式,即使編譯時,也不會很好地被.NET正則表達式引擎優化。如果包含/排除列表變大,則簡單的連接例程已經非常昂貴。最後,替代方案(逐個匹配單個句子)可能會更慢。爲了找出問題,衡量兩種方法的性能。

更新:修正了代碼中的錯誤並添加了說明。

+0

優秀!這必須適用於每個句子,是嗎?任何擴展它來適用於整個製表符分隔字符串的方式還是這種瘋狂?謝謝。 – metaopoly 2009-12-10 12:49:05

+0

您可以將它應用於任何長度的任何字符串。如果你想單獨應用它到一個字符串的部分(其中一套完整的規則適用於這些部分),我建議首先分割字符串,然後通過每個元素「foreach」並在每個元素上應用正則表達式(don'不用擔心,正則表達式會被.NET緩存)。可以調整它,使其適用於標籤之間的部分,但這會變成一個非常複雜的正則表達式,甚至高級正則表達式用戶也會覺得很難理解。 – Abel 2009-12-10 13:31:18

+0

我發現了這個錯誤,但是當我發佈一個例子時,你已經修好了,好工作!這是我正在尋找的正則表達式。我將刪除「選項卡」要求,以查看是否有其他語言不可知變成了 – metaopoly 2009-12-10 14:25:43