Matching patterns with Javawednesday, december 11, 2019
If you’re using Java, there’s a high chance you’ve seen its pattern matching before.
String#matches(String) method internally uses the
Pattern type, which comprises more complex functionality:
Pattern is created by compiling a regular expression.
The pattern matches any input string and can optionally find capturing groups, which isolate certain parts of your string data.
The API is used as follows:
Pattern pattern = Pattern.compile("([\\^\\S]+) is powerful"); Matcher matcher = pattern.matcher("Java is powerful"); System.out.println(matcher.find()); // true System.out.println(matcher.group()); // Java is powerful System.out.println(matcher.group(1)); // Java
find() method finds the next occurrence of the pattern, which matches the whole input string in this example.
group() method returns either the whole capturing group, that is, matching the whole pattern, or, when qualified with an index, returns the individual capturing groups.
The capturing groups indexes start at
1, not at
There’s also a
matches() method which works slightly differently:
Pattern pattern = Pattern.compile("([\\^\\S]+) is powerful"); Matcher matcher = pattern.matcher("Our Java is powerful"); System.out.println(matcher.matches()); // false System.out.println(matcher.find()); // true
matches() attempts to match the whole input string to the pattern, from start to end, while
find() only tries to find the patterns somewhere in the input string.
Also, as reminder: Please use the shortcut methods
Pattern#matches(String, CharSequence) only for single matching invocations that are not repeated over and over again.
Patterns are rather heavy to compile and we should leverage the immutability of the Pattern type and reuse it for multiple matches.
The content of this post was reposted from my newsletter issue 034.
Found the post useful? Subscribe to my newsletter for more free content, tips and tricks on IT & Java:
All opinions are my own and do not reflect those of my employer or colleagues.