pattern.matcher()vs pattern.matches()

时间:2010-10-05 10:47:35

标签: java regex

我想知道为什么java regex pattern.matcher()和pattern.matches()的结果在提供相同的正则表达式和相同的字符串时会有所不同

String str = "hello+";
Pattern pattern = Pattern.compile("\\+");
Matcher matcher = pattern.matcher(str);

while (matcher.find()) {
    System.out.println("I found the text " + matcher.group() + " starting at " 
        + "index " + matcher.start() + " and ending at index " + matcher.end());
}

System.out.println(java.util.regex.Pattern.matches("\\+", str));

以上结果是:

I found the text + starting at index 5 and ending at index 6
false

我发现在matches(".*\\+")的情况下使用表达式匹配完整字符串可以正常工作。

8 个答案:

答案 0 :(得分:34)

pattern.matcher(String s)会返回一个Matcher,可以在字符串s查找模式。 pattern.matches(String str)测试,如果整个字符串(str)与模式匹配。

简而言之(只是为了记住差异):

  • pattern.matcher - 测试字符串是否包含-a 模式
  • pattern.matches - 测试字符串是否是模式

答案 1 :(得分:4)

Matcher.find()尝试查找与模式匹配的输入序列的下一个子序列。

Pattern.matches(String regex, CharSequence input)将正则表达式编译为Matcher并返回Matcher.matches()

Matcher.matches尝试将整个区域(字符串)与模式(正则表达式)进行匹配。

因此,在您的情况下,Pattern.matches("\\+", str)返回false,因为str.equals("+")为false。

答案 2 :(得分:3)

从Javadoc中,查看if,仅当整个区域部分

   /**
     * Attempts to match the entire region against the pattern.
     *
     * <p> If the match succeeds then more information can be obtained via the
     * <tt>start</tt>, <tt>end</tt>, and <tt>group</tt> methods.  </p>
     *
     * @return  <tt>true</tt> if, and only if, <b>the entire region</b> sequence
     *          matches this matcher's pattern
     */
    public boolean matches() {
        return match(from, ENDANCHOR);
    }

因此,如果您的String只是“+”,那么您将获得真实的结果。

答案 3 :(得分:2)

匹配尝试将表达式与整个字符串匹配。意思是,它会检查整个字符串是否为patern。 从概念上来说,就像这样,它隐含地在开始时添加^,在模式的末尾添加$。

For String str =“hello +”,如果你想让matches()返回true,你需要有像“。 \ +。”这样的模式

我希望这能回答你的问题。

答案 4 :(得分:0)

Pattern.matches正在测试整个String,你应该使用:

 System.out.println(java.util.regex.Pattern.matches(".*\\+", str));

表示任何字符串和+符号

答案 5 :(得分:0)

我认为你的问题应该是“我应该何时使用Pattern.matches()方法?”,答案是“从不”。你期望它返回一个匹配的子串的数组,比如.NET的Matches方法吗?这是一个非常合理的期望,但不,Java没有这样的。

如果你只是想做一个快速和肮脏的匹配,在任一端用.*装饰正则表达式,并使用字符串自己的matches()方法:

System.out.println(str.matches(".*\\+.*"));

如果要提取多个匹配项,或者之后访问有关匹配项的信息,请创建一个Matcher实例并使用方法,就像您在问题中所做的那样。 Pattern.matches()只不过是一个浪费的机会。

答案 6 :(得分:0)

Matcher matcher = pattern.matcher(text);

在这种情况下,将返回一个匹配器对象实例,该实例通过解释模式对输入文本执行匹配操作。然后我们可以使用matcher.find()来匹配编号。输入文本中的图案。

(java.util.regex.Pattern.matches("\\+", str))

在这里,匹配器对象将被隐式创建,并且将返回一个布尔值,该布尔值将整个文本与模式匹配。这将与String中的str.matches(regex)函数相同。

答案 7 :(得分:0)

java.util.regex.Pattern.matches("\\+", str)等效的代码为:

Pattern.compile("\\+").matcher(str).matches();

方法find将在字符串中找到模式的第一个匹配项。