4 回答

TA貢獻1801條經驗 獲得超8個贊
import "regexp"包 regexp 實現正則表達式搜索。
接受的正則表達式語法與 Perl、Python 和其他語言使用的通用語法相同。更準確地說,它是 RE2 接受并在https://golang.org/s/re2syntax中描述的語法 ,\C 除外。有關語法的概述,請運行
go doc regexp/syntax此包提供的正則表達式實現保證按輸入大小線性運行。(這是大多數正則表達式的開源實現不保證的屬性。)有關此屬性的更多信息,請參閱
http://swtch.com/~rsc/regexp/regexp1.html
或任何有關自動機理論的書。
通過設計,Go 正則表達式保證在輸入的大小上按線性時間運行,這是正則表達式的其他一些實現無法保證的屬性。請參閱正則表達式匹配可以簡單快速。

TA貢獻1862條經驗 獲得超6個贊
使用這個:
^DETAIL:\s*+Key[^\(]++\((.+)\)[^\(]+\(([^\)]+)\) already exists
解釋:
首先,原始正則表達式似乎與整個鍵組不匹配,您停在了lower(internal_name::text
,遺漏了復合鍵的某些列以及一個不平衡的括號。如果你這樣修改它,它應該可以捕獲復合鍵。如果不應該這樣做,請告訴我:
^DETAIL:.[^\(]+.(.+)\)[^\(]+.(.[^\)]+). already exists
只需更改它,正則表達式就可以“運行”,但仍然很慢。
他的主要原因之一就是這個[^\(]+
。它首先匹配并DETAIL: Failing row contains(space)
繼續匹配正則表達式的其余部分。它不會匹配,所以它回溯到少一個字符,直到DETAIL: Failing row contains
并繼續正則表達式的其余部分。它不會匹配,所以會回到DETAIL: Failing row contain
......等等。
避免這種情況的一種方法是使用所有格量詞。這意味著一旦你獲取了一些東西,你就無法返回。所以使用這個[^\(]++
而不是這個[^\(]+
(即:)^DETAIL:.[^\(]++.(.+)\)[^\(]+.(.[^\)]+). already exists
使正則表達式將步數從 28590 減少到 1290。
但你仍然可以改進它。如果您知道您所需的數據使用關鍵字key
,請使用它!這樣,由于它不存在于失敗的示例中,它會使正則表達式很快失?。ㄒ坏┧x取 DETAIL 和下一個詞)
所以如果你使用^DETAIL:\s*+Key[^\(]++.(.+)\)[^\(]+.(.[^\)]+). already exists
步驟現在只有 12。
如果您覺得使用key
過于具體,您可以使用不太通用的東西來嘗試找到“不是'失敗'”。像這樣:
^DETAIL:\s*+(?!Fail)[^\(]++.(.+)\)[^\(]+.(.[^\)]+). already exists
這樣就是17步。
最后,您可以調整匹配內容的正則表達式。
改變這個:
^DETAIL:\s*+Key[^\(]++.(.+)\)[^\(]+. # <============= here, use \( instead (.[^\)]+). already exists
這樣:
^DETAIL:\s*+Key[^\(]++.(.+)\)[^\(]+\((.[^\)]+). already exists
這將步驟從 538 減少到 215,因為你減少了回溯。
然后,在刪除幾個無用的點并將一些(應該是括號的)點替換為\(
或\)
(個人品味)之后,您將獲得最終的正則表達式:
^DETAIL:\s*+Key[^\(]++\((.+)\)[^\(]+\(([^\)]+)\) already exists

TA貢獻1820條經驗 獲得超2個贊
這是一個正則表達式怪物:)
為什么不拆分 2 個正則表達式?
檢查是否
already exists
匹配(非??欤?/p>使用現有的正則表達式提取要顯示的數據
^DET.[^\(]+.(.[^\)]+).[^\(]+.(.[^\)]+)
那應該可以大大加快您的代碼速度。(你甚至可以像我一樣縮短細節)

TA貢獻1851條經驗 獲得超4個贊
這并不是問題的真正答案,但我認為問題可能出在貪婪的運營商身上。無論如何,我認為你應該讓它的一部分變得懶惰以快速失敗。
我使用了這種模式,在 regex101 上的所有語言引擎上都可以:
^DETAIL:.+?\((.+)\).+?\((.+)\) already exists.
- 4 回答
- 0 關注
- 201 瀏覽
添加回答
舉報