Difference between matches() and find() in Java Regex Difference between matches() and find() in Java Regex java java

Difference between matches() and find() in Java Regex


matches tries to match the expression against the entire string and implicitly add a ^ at the start and $ at the end of your pattern, meaning it will not look for a substring. Hence the output of this code:

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:truefalsetruetrue*/

123 is a substring of a123b so the find() method outputs true. matches() only 'sees' a123b which is not the same as 123 and thus outputs false.


matches return true if the whole string matches the given pattern. find tries to find a substring that matches the pattern.


  • matches() - will only return true if the full string is matched
  • find() - will try to find the next occurrence within thesubstring that matches the regex.

Note the emphasis on "the next" in case of find(). That means, the result of calling find() multiple times might not be the same. In addition, by using find() you can call start() to return the position the substring was matched.


Example

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

Output

Found: falseFound: true - position 4Found: true - position 17Found: true - position 20Found: falseFound: falseMatched: false-----------Found: true - position 0Found: falseFound: falseMatched: trueMatched: trueMatched: trueMatched: true

So, be careful when calling find() multiple times if the Matcher object was not reset, even when the regex is surrounded with ^ and $ to match the full string.