2010-11-05 103 views
3

我想关于Java下面的代码:这个正则表达式有什么问题?

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)); 

它做几分钟的工作没有结果(在那之后我杀了VM)。 任何人都可以帮助我吗?

顺便说一句:你会推荐我做些什么来加速weblink-testng正则表达式的未来?

回答

7

[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的末尾。如果这是一个问题,这是一个小问题,但我已经把它留在那里,因为你已经在原始正则表达式中使用了它。

+0

您可以使用(i?)[a-z]而不是[a-zA-Z],它会忽略 – ant 2010-11-05 09:18:15

4

您试图将方案与使用方括号的字符类相匹配。这意味着只有零个或其中一个字符。你想要一个带括号的子模式。您也可以将{0,1}更改为?

此外,您应该删除google\\.com之前的时间段,因为您已经在您的正则表达式的子域子模式中寻找一段时间。正如赫鲁维姆指出的那样,你也忘了逃避那个时期。

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

即使这种改变并不能阻止Java在很长一段时间内在正则表达式中徘徊。 – 2010-11-05 08:08:19

+0

在第一个'*'之后加上'+'。 – tchrist 2010-11-05 12:16:00

3

([a-zA-Z]*.)部分,您需要转义.(因为现在它意味着“所有字符”)或将其删除。

+0

罢工!这是导致“无限循环”行为的错误。接得好! (使用ideone验证您的解决方案) – 2010-11-05 08:12:41

1

假设您修复了([a-zA-Z]*\\.),您需要将*更改为+,以使部件变为([a-zA-Z]+\\.)。否则,你会接受http://...google.com,这是无效的。

2

正则表达式有两个问题。

第一个很容易,正如其他人所提到的。你需要匹配“http://”作为子模式,而不是字符类。将括号更改为括号。

第二个问题导致性能很差。它导致正则表达式反复回溯,试图匹配模式。

你要做的是匹配零个或多个子域,它们是一组字母后跟一个点。既然你想明确地匹配这个点,就不要使用点。还要删除“google”前面的点,以便匹配“http://google.com/etc”(即,在Google面前没有前导点)。

所以,你的表情就变成了:

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

运行在你的榜样这个表达式只需要一秒钟的一小部分。

1

通过google.com之前的分组部分我假设您正在寻找URL主机名的一部分。我认为rexep是一个强大的工具,但你可以简单地使用URL Java class。有getHost()方法。然后,您可以检查主机名是否以google.com结尾并将其拆分或仅使用主机名的简单正则表达式。

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); 
    } 
+0

这取决于是否有网络连接以及性能要求。 – cherouvim 2010-11-05 08:30:15

+0

我测试了它没有直接HTTP网络连接(代理与密码),这个URL不能在浏览器中工作,但我能够使用URL类。你能否根据网络连接向我提供一些关于URL类的更多信息? – 2010-11-05 08:43:56

+0

我用正则表达式测试了性能 (http://)?([a-zA-Z0-9] + \\。)* google((syndication)|(--analytics))?\\。com /[-a-zA-Z0-9/_.?&=]* 和图案 google.com google-analytics.com googlesyndication.com 它需要985毫秒的正则表达式来检查100个000链接,而URL需要156毫秒 – 2010-11-05 10:02:46

相关问题