Java Regex中matches()和find()之间的区别

时间:2010-12-15 12:50:32

标签: java regex

我想了解matches()find()之间的区别。

根据Javadoc(根据我的理解),matches()将搜索整个字符串,即使它找到了它正在寻找的内容,find()会在找到它看起来的内容时停止对

如果这个假设是正确的,除非你想要计算它找到的匹配数量,否则我无法看到你想要使用matches()而不是find()

在我看来,String类应该是find()而不是matches()作为内置方法。

总结一下:

  1. 我的假设是否正确?
  2. 何时使用matches()代替find()
  3. 是否有用

6 个答案:

答案 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
*/

123a123b的子字符串,因此find()方法输出true。 matches()仅'看到'a123b123不同,因此输出错误。

答案 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()

Matcher类中的

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()

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");
        }
   }
}

输出:找到匹配项