代码之家  ›  专栏  ›  技术社区  ›  Alex Abdugafarov

这个正则表达式怎么了?

  •  3
  • Alex Abdugafarov  · 技术社区  · 15 年前

    String test = "http://asda.aasd.sd.google.com/asdasdawrqwfqwfqwfqwf";
    String regex = "[http://]{0,1}([a-zA-Z]*.)*\\.google\\.com/[-a-zA-Z/_.?&=]*";
    System.out.println(test.matches(regex));
    

    它确实工作了几分钟(之后我杀死了虚拟机),但没有结果。 有人能帮我吗?

    顺便问一句:你建议我在将来做些什么来加速weblink测试regex?

    6 回复  |  直到 15 年前
        1
  •  7
  •   paxdiablo    15 年前

    [http://] 是一个字符类,意思是 一 那些角色的集合。

    必须 从 http:// . 如果是可选的,您可以使用 (http://)?

    一个明显的问题是你在寻找 ([a-zA-Z]+.)*\\.google -这将做一个 许多 . 意思是“任何字符”,而不是你想要的文字周期。

    意味 , ([a-zA-Z]+\\.)*\\.google ,您仍然有问题-这将需要两个 前一个字符 google . 相反,你应该尝试:

    String regex = "(http://)?([a-zA-Z]+\\.)*google\\.com/[-a-zA-Z/_.?&=]*";
    

    我马上就回来了 true

    请记住,目前这需要 / 结束时 google.com . 如果这是一个问题,这是一个小的修复,但我已经离开那里,因为你有它在你原来的正则表达式。

        2
  •  4
  •   BoltClock    15 年前

    您正在尝试使用方括号将方案作为字符类进行匹配。这意味着只有零个或一个字符集。你想要一个带圆括号的子模式。你也可以改变 {0,1} 只是说 ?

    另外,你应该删除之前的句号 google\\.com

    String regex = "(http://)?([a-zA-Z]+\\.)*google\\.com/[-a-zA-Z/_.?&=]*";
    
        3
  •  3
  •   cherouvim    15 年前

    在 ([a-zA-Z]*.) 部分你要么需要逃离 .

        4
  •  2
  •   Barry Brown    15 年前

    正则表达式有两个问题。

    第二个问题导致性能非常差。它导致regex反复回溯,试图匹配模式。

    您要做的是匹配零个或多个子域,这些子域是一组字母后跟一个点。既然你想显式地匹配点,就逃出点。同时去掉“google”前面的点,这样就可以匹配“http://google.com/etc”(即,在google前面没有前导点)。

    String regex = "(http://){0,1}([a-zA-Z]+\\.)*google\\.com/[-a-zA-Z/_.?&=]*";
    

    在您的示例上运行这个regex只需要几秒钟。

        5
  •  1
  •   cherouvim    15 年前

    假设你修好了 ([a-zA-Z]*\\.) 你需要改变 * 到 + ([a-zA-Z]+\\.) . 否则你会接受 http://...google.com 这是无效的。

        6
  •  1
  •   Michał Niklas    15 年前

    google.com 我想你是在寻找URL主机名的一部分。我认为rexep是一个强大的工具,但是你可以简单地使用 URL Java class . 有 getHost() google.com网站 并将其拆分,或者只使用主机名使用一些更简单的regexp。

    URL url = new URL("http://asda.aasd.sd.google.com/asdasdawrqwfqwfqwfqwf");
    String host = url.getHost();
    if (host.endsWith("google.com"))
        {
        String [] parts = host.split("\\.");
        for (String s: parts)
            System.out.println(s);
        }