regex
Greedy and non-greedy Reg Ex matching
This is an example of how to use greedy and non-greedy regular expression matching. Greedy matching means that the expression will match as large a group as possible, while non-greedy means it will match the smallest group possible. Matching with greedy and non-greedy regular expressions implies that you should:
- Compile a String regular expression to a Pattern, using
compile(String regex)
API method of Pattern. - Use
matcher(CharSequence input)
API method of Pattern to create a Matcher that will match the given String input against this pattern. - Use
find()
API method to find the next subsequence of the input sequence that matches the pattern. - Follow the above steps for greedy and non-greedy regular expressions. A greedy regular expression is a word character followed by any character one or more times, while a non-greedy regular expression is a word character followed by any character one or more times and followed by the ?, that means that the first group found that matches the pattern is returned.
Let’s take a look at the code snippet that follows:
package com.javacodegeeks.snippets.core; import java.util.regex.Matcher; import java.util.regex.Pattern; public class GreedyAndNonGreedyRegExMatching { public static void main(String[] args) { Pattern pattern; Matcher matcher; // Greedy quantifiers pattern = Pattern.compile("A.*c"); // Greedy matcher = pattern.matcher("AbcAbc"); // attempt to find the next subsequence of the input sequence that matches the pattern matcher.find(); System.out.println("'AbcAbc' matches 'A.*c' --> " + matcher.group()); pattern = Pattern.compile("A.+"); // Greedy matcher = pattern.matcher("AbcAbc"); // attempt to find the next subsequence of the input sequence that matches the pattern matcher.find(); System.out.println("'AbcAbc' matches 'A.+' --> " + matcher.group()); // Nongreedy quantifiers pattern = Pattern.compile("A.*?c"); // Non-Greedy matcher = pattern.matcher("AbcAbc"); // attempt to find the next subsequence of the input sequence that matches the pattern matcher.find(); System.out.println("'AbcAbc' matches 'A.*?c' --> " + matcher.group()); pattern = Pattern.compile("A.+?"); // Non-Greedy matcher = pattern.matcher("AbcAbc"); // attempt to find the next subsequence of the input sequence that matches the pattern matcher.find(); System.out.println("'AbcAbc' matches 'A.+?' --> " + matcher.group()); } }
Output:
'AbcAbc' matches 'A.*c' --> AbcAbc
'AbcAbc' matches 'A.+' --> AbcAbc
'AbcAbc' matches 'A.*?c' --> Abc
'AbcAbc' matches 'A.+?' --> Ab
This was an example of how to use greedy and non-greedy regular expression matching in Java.