簡體   English   中英

Java 正則表達式非常慢(將嵌套量詞轉換為所有格量詞)

[英]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.URLjava.net.URI來解析 URL 來避免所有這些。


  1. java.io.URI在解析方面比java.net.URL做得更好。 試試那個。

  2. 解析 url 后,您可以檢查每個組件; 例如,檢查主機名是否可以解析。

  3. 如果您想要可以解析的 url,則需要區分絕對 url 和非絕對 url,並檢查“方案”是否是您可以處理的。

  4. 在沒有實際嘗試打開資源的情況下,您無法檢查 url 是否工作(即它對應於可檢索資源)。 由於多種可能的原因,即使這也不是最終的測試。

您可能會遇到災難性回溯的情況:檢查您的正則表達式是否與多個組中的相同字符不匹配,從而導致必須檢查的組合數量過多。

請參閱這篇文章以獲得解釋。

暫無
暫無

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

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