根据Javadoc(根据我的理解),matches()
将搜索整个字符串,即使它找到了它正在寻找的内容,find()
会在找到它看起来的内容时停止对
如果这个假设是正确的,除非你想要计算它找到的匹配数量,否则我无法看到你想要使用matches()
而不是find()
。
在我看来,String类应该是find()
而不是matches()
作为内置方法。
总结一下:
matches()
代替find()
?答案 0 :(得分:274)
matches
尝试将表达式与整个字符串进行匹配,并在开始时隐式添加^
,在模式结尾隐式添加$
,这意味着它不会查找子字符串。因此,此代码的输出:
public static void main(String[] args) throws ParseException {
Pattern p = Pattern.compile("\\d\\d\\d");
Matcher m = p.matcher("a123b");
System.out.println(m.find());
System.out.println(m.matches());
p = Pattern.compile("^\\d\\d\\d$");
m = p.matcher("123");
System.out.println(m.find());
System.out.println(m.matches());
}
/* output:
true
false
true
true
*/
123
是a123b
的子字符串,因此find()
方法输出true。 matches()
仅'看到'a123b
与123
不同,因此输出错误。
答案 1 :(得分:72)
matches
返回true。 find
尝试查找与模式匹配的子字符串。
答案 2 :(得分:48)
matches()
只有在匹配完整字符串时才会返回true。
find()
会尝试在匹配正则表达式的子字符串中找到下一个匹配项。注意强调“下一个”。这意味着,多次调用find()
的结果可能不一样。此外,通过使用find()
,您可以调用start()
来返回子字符串匹配的位置。
final Matcher subMatcher = Pattern.compile("\\d+").matcher("skrf35kesruytfkwu4ty7sdfs");
System.out.println("Found: " + subMatcher.matches());
System.out.println("Found: " + subMatcher.find() + " - position " + subMatcher.start());
System.out.println("Found: " + subMatcher.find() + " - position " + subMatcher.start());
System.out.println("Found: " + subMatcher.find() + " - position " + subMatcher.start());
System.out.println("Found: " + subMatcher.find());
System.out.println("Found: " + subMatcher.find());
System.out.println("Matched: " + subMatcher.matches());
System.out.println("-----------");
final Matcher fullMatcher = Pattern.compile("^\\w+$").matcher("skrf35kesruytfkwu4ty7sdfs");
System.out.println("Found: " + fullMatcher.find() + " - position " + fullMatcher.start());
System.out.println("Found: " + fullMatcher.find());
System.out.println("Found: " + fullMatcher.find());
System.out.println("Matched: " + fullMatcher.matches());
System.out.println("Matched: " + fullMatcher.matches());
System.out.println("Matched: " + fullMatcher.matches());
System.out.println("Matched: " + fullMatcher.matches());
将输出:
Found: false Found: true - position 4 Found: true - position 17 Found: true - position 20 Found: false Found: false Matched: false ----------- Found: true - position 0 Found: false Found: false Matched: true Matched: true Matched: true Matched: true
因此,如果find()
对象未重置,则多次调用Matcher
时要小心,即使正则表达式被^
和$
包围以匹配完整字符串。
答案 3 :(得分:5)
find()
将考虑针对正则表达式的子字符串,其中matches()
将考虑完整表达式。
find()
才会返回true。
public static void main(String[] args) {
Pattern p = Pattern.compile("\\d");
String candidate = "Java123";
Matcher m = p.matcher(candidate);
if (m != null){
System.out.println(m.find());//true
System.out.println(m.matches());//false
}
}
答案 4 :(得分:3)
matches();
不缓冲,但find()
缓冲区。 find()
首先搜索字符串的结尾,索引结果,并返回布尔值和相应的索引。
这就是为什么你有像
这样的代码1:Pattern.compile("[a-z]");
2:Pattern.matcher("0a1b1c3d4");
3:int count = 0;
4:while(matcher.find()){
5:count++: }
在 4:使用模式结构的正则表达式引擎将读取整个代码(索引到regex[single character]
指定的索引,以找到至少一个匹配。如果是这样的话匹配被找到,它将被索引,然后循环将基于索引结果执行,否则如果它没有提前计算,如matches()
;不。因为第一个字符,while语句永远不会执行匹配字符串不是字母表。
答案 5 :(得分:0)
matches()
方法检查并匹配传递给Pattern.matcher()
方法的整个文本的正则表达式。如果正则表达式与整个文本匹配,则matches()
方法将返回true。如果不是,则matches()
方法返回false。
示例:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test {
public static void main(String[] args) {
String regex = "(.*)(\\d+)(.*)";
String input = "This is a sample Text, 1234, with numbers to match. "
+ "\n This is the second line in the text "
+ "\n This is third line in the text";
//Creating a pattern object
Pattern pattern = Pattern.compile(regex);
//Creating a Matcher object
Matcher matcher = pattern.matcher(input);
if(matcher.matches()) {
System.out.println("Match found");
} else {
System.out.println("Match not found");
}
}
}
输出:找不到匹配项
find()
搜索正则表达式的出现传递到Pattern.matcher()
。如果在文本中找到多个匹配项,则find()
将搜索第一个匹配项,然后对find()
的多个调用将依次匹配其他匹配项。示例:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test {
public static void main(String[] args) {
String regex = "(.*)(\\d+)(.*)";
String input = "This is a sample Text, 1234, with numbers to find. "
+ "\n This is the second line in the text "
+ "\n This is third line in the text";
//Creating a pattern object
Pattern pattern = Pattern.compile(regex);
//Creating a Matcher object
Matcher matcher = pattern.matcher(input);
//System.out.println("Current range: "+input.substring(regStart, regEnd));
if(matcher.find()) {
System.out.println("Match found");
} else {
System.out.println("Match not found");
}
}
}
输出:找到匹配项