Java RegEx问题 - 。*(www)。* vs.(www)

时间:2009-03-09 18:49:35

标签: java regex

我的好友目前正在使用Java中的JpCap进行修补,我们发现了一些有关Java中正则表达式的有趣(可能是?)问题。

仅捕获HTTP流量并随后进行分析。为此他正在使用这样的模式:

Pattern p = Pattern.compile("(www)");

但是我们俩都没能找到:为什么上面的模式根本没有产生匹配,而以下是:

Pattern p = Pattern.compile(".*(www).*");

对于我所看到的,这些都应该是相同的,不是吗? 我对正则表达式没有太多经验,所以对这个问题可能有一个非常简单的答案:)

4 个答案:

答案 0 :(得分:7)

您的第一个模式只接受字符串'www'。

第二种模式接受任何地方都带有“www”的字符串。

这个website提供了有关Java正则表达式的更多信息。

答案 1 :(得分:5)

哦,没关系,我发现我们两个都是API盲人;)

我们正在使用

Matcher.matches()

将模式与整个字符串匹配,而不是

Matcher.find()

试图在给定字符串中的任何位置找到模式。

感谢您的回答! :)

答案 2 :(得分:1)

我假设您正在使用matches()方法,因此在这种情况下的正则表达式应用于行。这意味着任何正则表达式都有行首和行尾字符的开头添加“引擎盖下”。

所以不是让"(www)"获得"^(www)$",而是正如您所见,这显着改变了正则表达式的含义。

有关java的这种细微差别的更多信息:http://www.regular-expressions.info/java.html

答案 3 :(得分:-1)

正则表达式需要分隔符。

“符号仅用于声明字符串,因此无效作为分隔符。

你的第二个例子有分隔符,所以它有效。