簡體   English   中英

匹配字符串中所有模式的最佳方法?

[英]Best way to match all patterns in a string?

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

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

123
xyz
abc

像這樣的字符串:

john_smith_123456_abcdef_9999_tuv 

將是錯誤的,因為它只包含 3 個中的 2 個,而字符串如下:

jane_doe_abcdef_123_9999_tuvwxyz 

會是真的,因為它包含所有 3

那么首先,regex 還是 string.Contains()? 或者是否存在一個性能優於另一個的權衡點? 其次,假設正則表達式是通往 go 的路徑,那么用於此場景的最佳正則表達式類型是什么?

多謝!

以下正則表達式將起作用:

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

這使用lookaheads來確保您要查找的三個子字符串包含在字符串中的某個位置,然后使用.*在找到所有子字符串時使用整個字符串。

您正在尋找的是大字符串中的特定字符串,對嗎? 如果是這樣,正則表達式在這里不會對你有多大好處。 當然,您可以做一些前瞻性的事情,但您並沒有真正獲得任何東西——無論是可讀性方面還是性能方面。 正則表達式用於查找文本中的模式,而不是用於子字符串

只需遍歷列表、數組等...並使用Contains查找每個 substring。

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

對於這樣一個簡單的任務,正則表達式似乎有點矯枉過正。 您實際上並不是在尋找 substring 這樣的模式,在這種情況下, String.Contains()非常適合這項工作(假設您沒有未告訴我們的“隱藏”要求)。

沒有經驗法則來決定基於正則表達式的解決方案何時會太慢。 事實上,沒有理由期望正則表達式比任何其他技術都慢。 與任何其他工具一樣,如果您相當有能力使用它並且它似乎提供了最簡單的方法,請提前撥打 go 並嘗試一下。 當您為有意義的測試編寫了足夠多的代碼時,對其進行基准測試。

此外,如果模式非常簡單以至於您可以使用Contains() ,那么搞亂正則表達式並創建 共振級聯 災難性回溯場景的可能性也很小。 請記住:正則表達式不會破壞 CPU,正則表達式作者會這樣做。 :D

對於FJ提出的多重前瞻方法,我傾向於同意你的看法; 對於這項工作來說可能太慢了。 它實際上與多次調用Contains()相同,但由於回溯會產生額外的開銷。 無論如何都值得測試,但我會先嘗試這種方法:

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

在前瞻方法必須為每個搜索詞掃描整個字符串的情況下,此正則表達式只掃描一次,並且永遠不會回溯。 每次它命中一個搜索詞時,緊隨該詞的捕獲組就被認為參與了匹配,即使它什么也沒捕獲到。 當到達字符串末尾時,如果該組參與匹配,則每個反向引用再次“不匹配”; 否則報告失敗,整體匹配失敗。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM