[英]Java regex very slow (translate nested quantifiers to possessive quantifiers)
我發現這個正則表達式匹配 url(最初在 Javascript 中由 Daring Fireball 提供)在 java 中有效,但在某些情況下非常慢:
private final static String pattern =
"\\b" +
"(" + // Capture 1: entire matched URL
"(?:" +
"[a-z][\\w-]+:" + // URL protocol and colon
"(?:" +
"/{1,3}" + // 1-3 slashes
"|" + // or
"[a-z0-9%]" + // Single letter or digit or '%'
// (Trying not to match e.g. "URI::Escape")
")" +
"|" + // or
"www\\d{0,3}[.]" + // "www.", "www1.", "www2." … "www999."
"|" + // or
"[a-z0-9.\\-]+[.][a-z]{2,4}/" + // looks like domain name followed by a slash
")" +
"(?:" + // One or more:
"[^\\s()<>]+" + // Run of non-space, non-()<>
"|" + // or
"\\((?:[^\\s()<>]+|(?:\\([^\\s()<>]+\\)))*\\)" + // balanced parens, up to 2 levels
")+" +
"(?:" + // End with:
"\\((?:[^\\s()<>]+|(?:\\([^\\s()<>]+\\)))*\\)" + // balanced parens, up to 2 levels
"|" + // or
"[^\\s`!\\-()\\[\\]{};:'\".,<>?«»“”‘’]" + // not a space or one of these punct chars (updated to add a 'dash'
")" +
")";
我發現主題: Java 正則表達式運行速度非常慢,問題出在這段代碼中:
"(?:" + // One or more:
"[^\\s()<>]+" + // Run of non-space, non-()<>
"|" + // or
"\\((?:[^\\s()<>]+|(?:\\([^\\s()<>]+\\)))*\\)" + // balanced parens, up to 2 levels
")+"
似乎要解決這個問題,我需要使這些內部量詞具有所有格(實際上是嵌套的),但我不知道該怎么做謝謝你的建議,對不起我的英語不好!
您可以通過使用java.net.URL
或java.net.URI
來解析 URL 來避免所有這些。
java.io.URI
在解析方面比java.net.URL
做得更好。 試試那個。
解析 url 后,您可以檢查每個組件; 例如,檢查主機名是否可以解析。
如果您想要可以解析的 url,則需要區分絕對 url 和非絕對 url,並檢查“方案”是否是您可以處理的。
在沒有實際嘗試打開資源的情況下,您無法檢查 url 是否工作(即它對應於可檢索資源)。 由於多種可能的原因,即使這也不是最終的測試。
您可能會遇到災難性回溯的情況:檢查您的正則表達式是否與多個組中的相同字符不匹配,從而導致必須檢查的組合數量過多。
請參閱這篇文章以獲得解釋。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.