Java,String.matches的区别

时间:2013-06-11 12:31:55

标签: java regex

String.matches给出不同的结果(我认为它有充分的理由,但我不知道为什么)。

请参阅下面的示例:

复杂程序:

...
line.matches(pattern) -> false
...

简单程序:

String line = "blabla"; //copy pasted during debug of Complex program
String pattern = "bl.*"; //copy pasted during debug of Complex program

line.matches(pattern) -> true

问:如何找出复杂程序中匹配错误的原因?

1 个答案:

答案 0 :(得分:10)

很可能你是另一个陷入Java .matches()操作陷阱的程序员 - 并且导致许多人认为该方法的名称用词不当。

阅读本文,使用红铁将其印在头上:

Java .matches()方法的行为就好像作为参数给出的正则表达式被输入开头^和输入结束$锚定所包围。因此,它会尝试并匹配整个输入的正则表达式。

这与绝大多数使用正则表达式(并且您真正同意)的编程语言采用的“正则表达式匹配”的定义不同,其中正则表达式可以匹配输入中的任何地方。正如您将从下面的许多评论中看到的那样,其他人不同意。

那是:

"foobar".matches("foobar") == true
"foobar and something else".matches("foobar") == false
Java中的

真正的正则表达式匹配是使用.find()完成的;并且String没有它。您必须使用PatternMatcher

final Pattern p = Pattern.compile("foobar");
final Matcher m = p.matcher("foobar and something else");
m.find(); // true!
m.matches(); // false!

即。 matches()实际上会使用模式"^foobar$"