java中正则表达式执行太慢[重复]

2024-04-10

我的目的是匹配这种不同的网址:
网址.com
my.url.com
my.extend.url.com
a.super.extended.url.com
等等...

因此,我决定构建正则表达式,在 url 的开头和结尾处包含一个字母或数字,并拥有无限数量的带有字母数字字符和点的“子域”。例如,在“my.extended.url.com”中,“my”中的“m”是正则表达式的第一类,“com”中的“m”是正则表达式的最后一个类,而“y.”, “延长。”和“网址”。是正则表达式的第二类。

使用下面代码中的模式和主题,我希望 find 方法返回 false,因为该 url 必须不匹配,但它使用 100% 的 CPU,并且似乎处于无限循环中。

    
    String subject = "www.association-belgo-palestinienne-be";
    Pattern pattern = Pattern.compile("^[A-Za-z0-9]\\.?([A-Za-z0-9_-]+\\.?)*[A-Za-z0-9]\\.[A-Za-z]{2,6}");

    Matcher m = pattern.matcher(subject);
    System.out.println("    Start");
    boolean hasFind = m.find();
    System.out.println("    Finish : " + hasFind);
  

只打印:

  
      Start
  

我无法使用正则表达式测试器重现该问题。
正常吗?问题来自我的正则表达式吗?
难道是因为我的Java版本(1.6.0_22-b04 / JVM 64位17.1-b03)?

预先感谢您的帮助。


问题是([A-Za-z0-9_-]+\\.?)*正则表达式的一部分。请注意,它在另一个量词 (*) 内有一个量词 (+)。这导致灾难性的回溯 http://www.regular-expressions.info/catastrophic.html- 基本上,它必须尝试指数数量的匹配才能检查正则表达式,至少是大多数正则表达式引擎的实现方式(包括 Java 引擎)。

如果你使用所有格量词 http://www.regular-expressions.info/possessive.html,您将能够避免这个问题,但是这会改变您的正则表达式的含义,并且它将不再匹配您希望它匹配的内容。

我认为这里的技巧是找到一个正则表达式来表达你想要解决的问题,而不需要双量词。例如,以下内容应该有效:

Pattern.compile("^[A-Za-z0-9]\\.?([A-Za-z0-9_-]|[A-Za-z0-9_-]\\.)*[A-Za-z0-9]\\.[A-Za-z]{2,6}$");

我认为这表达了您尝试匹配的同一类字符串,并且应该更快。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java中正则表达式执行太慢[重复] 的相关文章

随机推荐