import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Example {
public static void main(String[] args) {
final String regex = "^\n"
+ "(?<integer>\n"
+ " (?<n1>\n"
+ " (?<n1nz>[一二三四五六七八九壹贰叁肆伍陆柒捌玖])\n"
+ " |(?<n1wz>[〇零])\n"
+ " )\n"
+ " |(?<n2>\n"
+ " (?<h2nz>\n"
+ " (?<n2nz>(?<n2z1>(?&n1nz)[十拾])(?&n1nz))\n"
+ " |[十拾](?&n1nz)\n"
+ " )\n"
+ " |(?<h2wz>\n"
+ " (?<n2wz>(?&n2z1))\n"
+ " |[十拾]\n"
+ " )\n"
+ " )\n"
+ " |(?<n3>\n"
+ " (?<n3nz>(?<n3z2>(?<h1nz>(?&n1nz)|两)[百佰])((?&n2nz)|(?&n1wz)(?&n1nz)))\n"
+ " |(?<n3wz>(?&n3z2)(?&n2wz)?)\n"
+ " )\n"
+ " |(?<n4>\n"
+ " (?<n4nz>(?<n4z3>(?&h1nz)[千仟])((?&n3nz)|(?&n1wz)((?&n2nz)|(?&n1nz))))\n"
+ " |(?<n4wz>\n"
+ " (?&n4z3)(?&n3wz)?\n"
+ " |(?&n4z3)(?&n1wz)(?&n2wz)\n"
+ " )\n"
+ " )\n"
+ " |(?<n5_7>\n"
+ " (?<n5_7nz>\n"
+ " (?<n5_7z4>(?<h1_3nz>(?&h1nz)|(?&h2nz)|(?&n3nz))[万萬])((?&n4nz)|(?&n1wz)((?&n3nz)|(?&n2nz)|(?&n1nz)))\n"
+ " |(?<n6_7z5_7>(?<h2_3wz>(?&h2wz)|(?&n3wz))[万萬])((?&n1wz)((?&n4nz)|(?&n3nz)|(?&n2nz)|(?&n1nz)))\n"
+ " )\n"
+ " |(?<n5_7wz>\n"
+ " (?&n5_7z4)((?&n4wz)|(?&n1wz)((?&n3wz)|(?&n2wz)))?\n"
+ " |(?&n6_7z5_7)((?&n1wz)((?&n4wz)|(?&n3wz)|(?&n2wz)))?\n"
+ " )\n"
+ " )\n"
+ " |(?<n8>\n"
+ " (?<n8nz>\n"
+ " (?<n8z4>(?&n4nz)[万萬])((?&n4nz)|(?&n1wz)((?&n3nz)|(?&n2nz)|(?&n1nz)))\n"
+ " |(?<n8z5_7>(?&n4wz)[万萬])(?&n1wz)((?&n4nz)|(?&n3nz)|(?&n2nz)|(?&n1nz))\n"
+ " )\n"
+ " |(?<n8wz>\n"
+ " (?&n8z4)((?&n4wz)|(?&n1wz)((?&n3wz)|(?&n2wz)))?\n"
+ " |(?&n8z5_7)((?&n1wz)((?&n4wz)|(?&n3wz)|(?&n2wz)))?\n"
+ " )\n"
+ " )\n"
+ " |(?<n9_16>\n"
+ " ((?&h1_3nz)(?&n4nz)|(?&n5_7nz)(?&n8nz))[亿億]((?&n8)|(?&n1wz)((?&n5_7)|(?&n4)|(?&n3)|(?&n2)|(?&n1)))?\n"
+ " |((?&h2_3wz)(?&n4wz)|(?&n5_7wz)(?&n8wz))[亿億]((?&n1wz)((?&n8)|(?&n5_7)|(?&n4)|(?&n3)|(?&n2)|(?&n1)))?\n"
+ " )\n"
+ ")\n"
+ "(?<decimal>点\n"
+ "[〇一二三四五六七八九零壹贰叁肆伍陆柒捌玖]+\n"
+ ")?\n"
+ "$";
final String string = "三十四\n"
+ "↑True\n"
+ "三十四万\n"
+ "↑True\n"
+ "三十四万三百二十\n"
+ "↑False\n"
+ "三百四十五万零三百二十\n"
+ "↑True\n"
+ "三十四万零三百\n"
+ "↑True\n"
+ "二十万零一千\n"
+ "↑True\n"
+ "二十万零一百\n"
+ "↑True\n"
+ "二十万零一\n"
+ "二十万\n"
+ "二万零一十\n"
+ "二万零一百\n"
+ "二万零一百一十\n"
+ "二万一千一百一十一\n"
+ "两万零一\n"
+ "二百万零一\n"
+ "两千万零一\n"
+ "两千两百万零一\n"
+ "两千万零一十\n"
+ "两千万零一十二\n"
+ "两万零二千\n"
+ "两千万零两百\n"
+ "两千万零二十\n"
+ "两千万零二百二十\n"
+ "二千零二十一\n"
+ "二千零二十\n"
+ "两千万零二千零二十一\n"
+ "两千万零二十一\n"
+ "两千万零二百\n"
+ "两千万零两百二十一\n"
+ "两千万零两千两百二十\n"
+ "两千万零二千零二十\n"
+ "两千万零二千零二\n"
+ "两千万零二百零三\n"
+ "两千三百四十万三千二百三十\n"
+ "二百万\n"
+ "两千二百二十一万\n"
+ "两千两百万\n"
+ "两千两百一十万\n"
+ "两千三百四十一万\n"
+ "两千零二十\n"
+ "两千零二十万\n"
+ "两千零一十五\n"
+ "两千零一十五万\n"
+ "两千零三十万\n"
+ "两百一十万\n"
+ "一十万\n"
+ "十万\n"
+ "两千两百\n"
+ "两千两百万\n"
+ "两千两百二十万\n"
+ "两千三百四十五万\n"
+ "两千零一十一万\n"
+ "两百一十万\n"
+ "两百四十二万\n"
+ "两百零六万\n"
+ "二十一万\n"
+ "四百万\n\n"
+ "两百一十万\n\n"
+ "两百万零三百零一\n"
+ "↑True\n"
+ "三百四十万零一\n"
+ "↑True\n"
+ "四百五十六万零一十\n"
+ "↑True\n"
+ "五百零七万零三百\n"
+ "↑True\n"
+ "一千万零二十三\n"
+ "↑True\n"
+ "三百一十\n"
+ "↑True\n"
+ "一千两百万零三百一十\n"
+ "↑True\n"
+ "三百\n"
+ "一千万零三百\n"
+ "↑True\n"
+ "一千零一万零三百零一\n"
+ "↑True\n"
+ "一千两百三十万零一十\n"
+ "↑True\n"
+ "一千两百四十四万零二十三\n"
+ "↑True\n"
+ "一千\n"
+ "↑True\n"
+ "一千零四十\n"
+ "↑True\n"
+ "一千零四十\n"
+ "↑True\n"
+ "一千四百\n"
+ "↑True\n"
+ "一千零四万\n"
+ "↑True\n"
+ "一千零四十\n"
+ "一千零四十万\n"
+ "↑True\n"
+ "一千四百万\n"
+ "↑True\n"
+ "一千零四十五万零两百零四\n"
+ "↑True\n"
+ "一亿零两百万\n"
+ "↑True\n"
+ "一亿两千万\n"
+ "↑True\n"
+ "一亿零两千万\n"
+ "↑False\n"
+ "十亿零两千万\n"
+ "↑True\n"
+ "一亿零两百\n"
+ "↑True\n"
+ "一亿零二十\n"
+ "↑True\n"
+ "一亿零二十二\n"
+ "↑True\n"
+ "一万亿零二\n"
+ "↑True\n"
+ "九千八百七十六万五千四百三十二亿一千两百三十四万五千六百七十八\n"
+ "↑True\n"
+ "九千零七十六万零四百零二亿零两百零四万零六百零八\n"
+ "↑True\n"
+ "一千零\n"
+ "↑False\n"
+ "两千零零六\n"
+ "↑False\n"
+ "两千零六\n"
+ "↑True\n"
+ "九千零零七十六万零四百零二亿零两百零四万零六百零八\n"
+ "↑False\n"
+ "九千零六万零二亿零四万零八\n"
+ "↑True\n"
+ "九千零六万零二亿零\n"
+ "↑False\n"
+ "一千万亿零二点二\n"
+ "↑True\n"
+ "一千零二万亿零二\n"
+ "↑True\n"
+ "一千零二万億零二点两\n"
+ "↑False\n"
+ "一千零二万億零二点四\n"
+ "↑True\n"
+ "两万两千\n"
+ "↑True\n"
+ "两万零两千\n"
+ "↑False\n"
+ "两万零两百\n"
+ "↑True\n"
+ "两亿零五千万\n"
+ "↑False\n"
+ "两亿零五百万\n"
+ "↑True\n"
+ "一百\n"
+ "↑True\n"
+ "九千\n"
+ "↑True\n"
+ "两千零两百\n"
+ "↑False\n"
+ "五百万零四千三百\n"
+ "↑True\n"
+ "五百万四千三百\n"
+ "↑False\n"
+ "十万零一千亿四千万零四千\n"
+ "↑False\n"
+ "十万零一千亿零四千万零四千\n"
+ "↑True\n"
+ "十万零一千亿\n"
+ "↑True\n"
+ "十万零四千零四十\n"
+ "两千两百\n"
+ "↑True\n"
+ "二百零六十\n"
+ "↑False\n"
+ "二百五十\n"
+ "↑True\n"
+ "二百五十七\n"
+ "↑True\n"
+ "二百零八\n"
+ "↑True\n"
+ "二\n"
+ "↑True\n"
+ "两\n"
+ "↑False\n"
+ "一十\n"
+ "↑True\n"
+ "二十\n"
+ "↑True\n"
+ "十五\n"
+ "↑True\n"
+ "一十五\n"
+ "↑True\n"
+ "二十五\n"
+ "↑True\n"
+ "三十四\n"
+ "↑True\n"
+ "两百\n"
+ "↑True\n"
+ "三百四十\n"
+ "↑True\n"
+ "四百五十六\n"
+ "↑True\n"
+ "五百零七\n"
+ "↑True\n"
+ "一千\n"
+ "↑True\n"
+ "一千零一\n"
+ "↑True\n"
+ "一千零四十\n"
+ "↑True\n"
+ "一千零四十五\n"
+ "↑True\n"
+ "一千两百\n"
+ "↑True\n"
+ "一千两百三十\n"
+ "↑True\n"
+ "一千两百四十四\n"
+ "↑True\n"
+ "两千六百八十万零一百\n"
+ "↑True\n"
+ "两千六百八十万零一千\n"
+ "↑True\n"
+ "两千六百八十万一千\n"
+ "↑False\n"
+ "两千六百零八万一千\n"
+ "↑True\n"
+ "二万\n"
+ "↑True\n"
+ "两万\n"
+ "↑True\n"
+ "二十万\n"
+ "↑True\n"
+ "十五万\n"
+ "↑True\n"
+ "三十四万\n"
+ "↑True\n"
+ "两百万\n"
+ "↑True\n"
+ "三百四十万\n"
+ "↑True\n"
+ "四百五十六万\n"
+ "↑True\n"
+ "五百零七万\n"
+ "↑True\n"
+ "一千万\n"
+ "↑True\n"
+ "一千两百万\n"
+ "↑True\n"
+ "一千零一万\n"
+ "↑True\n"
+ "一千两百三十万\n"
+ "↑True\n"
+ "一千两百四十四万\n"
+ "↑True\n"
+ "一千零四十\n"
+ "↑Tru\n"
+ "一千万\n"
+ "↑Truee\n"
+ "一千四百万\n"
+ "↑Truee\n"
+ "一千零四万\n"
+ "↑Truee\n"
+ "一千零四十\n"
+ "↑True\n"
+ "一千零四十万\n"
+ "↑True\n"
+ "一千零四十五\n"
+ "↑True\n"
+ "一千零四十五万\n"
+ "↑True\n"
+ "二万零一\n"
+ "↑True\n"
+ "两万零三百\n"
+ "↑True\n"
+ "二十\n"
+ "↑True\n"
+ "二十万\n"
+ "↑True\n"
+ "两百万\n"
+ "两千万\n"
+ "二万\n"
+ "十五万零二十三\n"
+ "↑True\n";
final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE | Pattern.COMMENTS);
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