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"
+ " # ==== MORE ====\n"
+ " (?<one_to_quadrillion>\n"
+ " (?&one_to_999)[ ]quadrillion(?:[ ](?&one_to_999_999_999_999_999))?|\n"
+ " (?&one_to_999_999_999_999_999)\n"
+ " ) # end one_to_quadrillion definition\n"
+ " (?<one_to_quintillion>\n"
+ " (?&one_to_999)[ ]quintillion(?:[ ](?&one_to_quadrillion))?|\n"
+ " (?&one_to_quadrillion)\n"
+ " ) # end one_to_quintillion definition\n"
+ " (?<one_to_sextillion>\n"
+ " (?&one_to_999)[ ]sextillion(?:[ ](?&one_to_quintillion))?|\n"
+ " (?&one_to_quintillion)\n"
+ " ) # end one_to_sextillion definition\n"
+ " (?<one_to_septillion>\n"
+ " (?&one_to_999)[ ]septillion(?:[ ](?&one_to_sextillion))?|\n"
+ " (?&one_to_sextillion)\n"
+ " ) # end one_to_septillion definition\n"
+ " (?<one_to_octillion>\n"
+ " (?&one_to_999)[ ]octillion(?:[ ](?&one_to_septillion))?|\n"
+ " (?&one_to_septillion)\n"
+ " ) # end one_to_octillion definition\n"
+ " (?<one_to_nonillion>\n"
+ " (?&one_to_999)[ ]nonillion(?:[ ](?&one_to_octillion))?|\n"
+ " (?&one_to_octillion)\n"
+ " ) # end one_to_nonillion definition\n"
+ " (?<one_to_decillion>\n"
+ " (?&one_to_999)[ ]decillion(?:[ ](?&one_to_nonillion))?|\n"
+ " (?&one_to_nonillion)\n"
+ " ) # end one_to_decillion definition\n\n"
+ " (?<bignumber>\n"
+ " zero|(?&one_to_decillion)\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"
+ "\\b(?:(?&ten_to_19)\\s+hundred|(?&bignumber))\\b\n"
+ "#\\b(?:(?&ten_to_19)\\s+hundred|(?&bignumber)(?:[ ](?&decimals))?)\\b # No decimals for now\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\n"
+ "twelve\n"
+ "seventy two\n"
+ "three hundred\n"
+ "twelve hundred\n"
+ "twelve thousand three hundred four\n"
+ "six million\n"
+ "six million four hundred thousand five\n"
+ "one hundred twenty three billion four hundred fifty six million seven hundred eighty nine thousand twelve\n"
+ "four decillion";
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