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
问:如何找出复杂程序中匹配错误的原因?
答案 0 :(得分:10)
很可能你是另一个陷入Java .matches()
操作陷阱的程序员 - 并且导致许多人认为该方法的名称用词不当。
阅读本文,使用红铁将其印在头上:
Java .matches()
方法的行为就好像作为参数给出的正则表达式被输入开头^
和输入结束$
锚定所包围。因此,它会尝试并匹配整个输入的正则表达式。
这与绝大多数使用正则表达式(并且您真正同意)的编程语言采用的“正则表达式匹配”的定义不同,其中正则表达式可以匹配输入中的任何地方。正如您将从下面的许多评论中看到的那样,其他人不同意。
那是:
"foobar".matches("foobar") == true
"foobar and something else".matches("foobar") == false
Java中的 真正的正则表达式匹配是使用.find()
完成的;并且String
没有它。您必须使用Pattern
和Matcher
:
final Pattern p = Pattern.compile("foobar");
final Matcher m = p.matcher("foobar and something else");
m.find(); // true!
m.matches(); // false!
即。 matches()
实际上会使用模式"^foobar$"
。