2012-04-10 100 views
4

匹配給定字符串中存在的一組模式的最佳方式是什麼?例如,假設我收集了數千箇中等長度的字符串(每個字符約30-50個字符)。用戶需要能夠指定一組模式(甚至不是僅僅是一系列字符的模式),每個字符串將被評估,該字符串必須包含指定的所有模式。匹配字符串中所有模式的最佳方法?

所以假定用戶要評估以下模式:

123 
xyz 
abc 

一個字符串,如:

john_smith_123456_abcdef_9999_tuv 

是假的,因爲它僅包含3第2,而串狀:

jane_doe_abcdef_123_9999_tuvwxyz 

會爲真,因爲它包含所有3

所以首先,正則表達式或string.Contains()?還是有一個交易點,一個表現比另一個更好?第二,假設正則表達式是要走的路,那麼在這個場景中使用哪種正則表達式的最佳類型?

非常感謝!

+1

你可能要考慮http://incubator.apache.org/lucene.net/ – 2012-04-10 21:49:21

回答

1

你在找什麼是大字符串內的特定字符串,對不對?如果是這樣,正則表達式在這裏不會對你有很大的好處。當然,你可以做一些前瞻性的事情,但是你沒有真正獲得任何東西 - 無論是可讀性還是性能。正則表達式用於在文本中找到模式,而不是子串

只需遍歷列表,數組,無論什麼......並使用Contains查找每個子字符串。

1

以下的正則表達式將工作:

^(?=.*123)(?=.*xyz)(?=.*abc).*$ 

這使用lookaheads,以確保您要查找的字符串中包含的某個地方,三子,然後使用.*消耗,如果所有的整個字符串子串被找到。

+0

好。與Regex.Escape結合使用時,可以以編程方式針對輸入字符串列表生成正則表達式。 – spender 2012-04-10 22:08:19

+0

感謝您的表達......但我傾向於相信,鑑於我會一直在尋找純粹的子字符串,而不是表達式,string.Contains()將超越即使最聰明的正則表達式,你會同意還是你認爲向前看將會產生足夠的差異? – snappymcsnap 2012-04-10 22:31:56

1

正則表達式幾乎總是簡單匹配的較慢選項。除非實際需要正則表達式功能,否則應該使用String.Contains()。如果只允許用戶輸入實際的字符串進行測試,則不需要正則表達式。

0

對於這樣一個簡單的任務,正則表達式看起來像是矯枉過正。你並不是真的在尋找模式這麼多子字符串,在這種情況下String.Contains()非常適合這項工作(假設你沒有任何你沒有告訴我們的「隱藏」需求)。

0

決定何時基於正則表達式的解決方案速度太慢,沒有經驗法則。事實上,沒有理由期望正則表達式比任何其他技術都要慢。像任何其他工具一樣,如果您有合理的使用能力並且似乎提供了最簡單的方法,請繼續嘗試。當你爲測試編寫的代碼足夠有意義時,請對其進行基準測試。

此外,如果圖案非常簡單以至於可以使用Contains(),那麼也很少有機會混淆正則表達式並創建 共振級聯 災難性回溯場景。請記住:正則表達式不會炒CPU,正則表達式的作者會這樣做。 :D

我傾向於同意你關於FJ提出的多向前看法;這份工作可能太慢了。這與多次調用Contains()的效果相同,但由於回溯導致額外開銷。是值得研究的,無論如何,但我第一次嘗試這種方法:

^(?>(?:123()|xyz()|abc()|.)+$\1\2\3) 

凡前瞻方法必須掃描潛在的整個字符串每個搜索詞,這個正則表達式掃描它只有一次,而且也從未回溯。每次搜索字詞被擊中時,緊接在該字詞後面的捕獲組被稱爲參與了匹配,即使它沒有捕獲任何東西。當到達字符串末尾時,如果該組參與了比賽,則每個反向引用「不匹配」;否則報告失敗並且總體匹配失敗。