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()
- will only return true if the full string is matchedfind()
- 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.