我想知道为什么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(".*\\+")
的情况下使用表达式匹配完整字符串可以正常工作。
答案 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
将在字符串中找到模式的第一个匹配项。