import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Example {
public static void main(String[] args) {
final String regex = "(?x) # free-spacing mode\n"
+ "(?(DEFINE)\n"
+ " # Within this DEFINE block, we'll define many subroutines\n"
+ " # They build on each other like lego until we can define\n"
+ " # a \"big number\"\n\n"
+ " (?<one_to_9> \n"
+ " # The basic regex:\n"
+ " # one|two|three|four|five|six|seven|eight|nine\n"
+ " # We'll use an optimized version:\n"
+ " # Option 1: four|eight|(?:fiv|(?:ni|o)n)e|t(?:wo|hree)|\n"
+ " # s(?:ix|even)\n"
+ " # Option 2:\n"
+ " (?:f(?:ive|our)|s(?:even|ix)|t(?:hree|wo)|(?:ni|o)ne|eight)\n"
+ " ) # end one_to_9 definition\n\n"
+ " (?<ten_to_19> \n"
+ " # The basic regex:\n"
+ " # ten|eleven|twelve|thirteen|fourteen|fifteen|sixteen|seventeen|\n"
+ " # eighteen|nineteen\n"
+ " # We'll use an optimized version:\n"
+ " # Option 1: twelve|(?:(?:elev|t)e|(?:fif|eigh|nine|(?:thi|fou)r|\n"
+ " # s(?:ix|even))tee)n\n"
+ " # Option 2:\n"
+ " (?:(?:(?:s(?:even|ix)|f(?:our|if)|nine)te|e(?:ighte|lev))en|\n"
+ " t(?:(?:hirte)?en|welve)) \n"
+ " ) # end ten_to_19 definition\n\n"
+ " (?<two_digit_prefix>\n"
+ " # The basic regex:\n"
+ " # twenty|thirty|forty|fifty|sixty|seventy|eighty|ninety\n"
+ " # We'll use an optimized version:\n"
+ " # Option 1: (?:fif|six|eigh|nine|(?:tw|sev)en|(?:thi|fo)r)ty\n"
+ " # Option 2:\n"
+ " (?:s(?:even|ix)|t(?:hir|wen)|f(?:if|or)|eigh|nine)ty\n"
+ " ) # end two_digit_prefix definition\n\n"
+ " (?<one_to_99>\n"
+ " (?&two_digit_prefix)(?:[- ](?&one_to_9))?|(?&ten_to_19)|\n"
+ " (?&one_to_9)\n"
+ " ) # end one_to_99 definition\n\n"
+ " (?<one_to_999>\n"
+ " (?&one_to_9)[ ]hundred(?:[ ](?:and[ ])?(?&one_to_99))?|\n"
+ " (?&one_to_99)\n"
+ " ) # end one_to_999 definition\n\n"
+ " (?<one_to_999_999>\n"
+ " (?&one_to_999)[ ]thousand(?:[ ](?&one_to_999))?|\n"
+ " (?&one_to_999)\n"
+ " ) # end one_to_999_999 definition\n\n"
+ " (?<one_to_999_999_999>\n"
+ " (?&one_to_999)[ ]million(?:[ ](?&one_to_999_999))?|\n"
+ " (?&one_to_999_999)\n"
+ " ) # end one_to_999_999_999 definition\n\n"
+ " (?<one_to_999_999_999_999>\n"
+ " (?&one_to_999)[ ]billion(?:[ ](?&one_to_999_999_999))?|\n"
+ " (?&one_to_999_999_999)\n"
+ " ) # end one_to_999_999_999_999 definition\n\n"
+ " (?<one_to_999_999_999_999_999>\n"
+ " (?&one_to_999)[ ]trillion(?:[ ](?&one_to_999_999_999_999))?|\n"
+ " (?&one_to_999_999_999_999)\n"
+ " ) # end one_to_999_999_999_999_999 definition\n\n"
+ " (?<bignumber>\n"
+ " zero|(?&one_to_999_999_999_999_999)\n"
+ " ) # end bignumber definition\n\n"
+ " (?<zero_to_9>\n"
+ " (?&one_to_9)|zero\n"
+ " ) # end zero to 9 definition\n\n"
+ " (?<decimals>\n"
+ " point(?:[ ](?&zero_to_9))+\n"
+ " ) # end decimals definition\n"
+ " \n"
+ ") # End DEFINE\n\n\n"
+ "####### The Regex Matching Starts Here ########\n"
+ "^(?&bignumber)(?:[ ](?&decimals))?$\n\n"
+ "### Other examples of groups we could match ###\n"
+ "#(?&bignumber)\n"
+ "# (?&one_to_99)\n"
+ "# (?&one_to_999)\n"
+ "# (?&one_to_999_999)\n"
+ "# (?&one_to_999_999_999)\n"
+ "# (?&one_to_999_999_999_999)\n"
+ "# (?&one_to_999_999_999_999_999)";
final String string = "one trillion\n"
+ "seven hundred twenty two\n"
+ "7even\n"
+ "zero point nine five\n"
+ "nine hundred ninety nine thousand two hundred thirteen";
final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = pattern.matcher(string);
while (matcher.find()) {
System.out.println("Full match: " + matcher.group(0));
for (int i = 1; i <= matcher.groupCount(); i++) {
System.out.println("Group " + i + ": " + matcher.group(i));
}
}
}
}
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for Java, please visit: https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html