1

我发现这个正则表达式可以匹配 url(最初是 Daring Fireball 在 Javascript 中),它在 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
")+"

似乎要解决这个问题,我需要使这些内部量词具有所有格(实际上是嵌套的),但我不知道该怎么做谢谢你的建议,对不起我的英语不好!

4

2 回答 2

3

java.net.URL您可以通过使用或java.net.URI解析网址来避免所有这些。


  1. java.io.URI在解析方面比java.net.URL. 试试那个。

  2. 解析 url 后,您可以检查每个组件;例如,检查主机名是否可以解析。

  3. 如果您想要可以解析的 url,则需要区分绝对 url 和非绝对 url,并检查“方案”是否是您可以处理的。

  4. 如果不实际尝试打开资源,则无法检查 url 是否有效(即它是否对应于可检索资源)。由于多种可能的原因,即使这也不是最终的测试。

于 2011-07-16T09:35:19.457 回答
0

您可能会遇到灾难性回溯的情况:检查您的正则表达式是否与多个组中的相同字符不匹配,从而导致必须检查的组合数量过多。

请参阅这篇文章以获得解释。

于 2011-07-16T08:57:52.150 回答