import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Example {
public static void main(String[] args) {
final String regex = "^\n"
+ "(?P<group>\n"
+ " (?P<structured>\n"
+ " (?P<single>\n"
+ " (?P<tag_first>\n"
+ " (?P<tag>\n"
+ " \\d+(?:\\/\\d+)+\n"
+ " |\n"
+ " (?P<repnum>\\$+(?:@\\^*-?\\d*)?)\n"
+ " |\n"
+ " [\\w:!-]\n"
+ " )++\n"
+ " (?P<attr>\n"
+ " (?P<short_attr>\n"
+ " \\.\n"
+ " (?P<short_val>\n"
+ " (?P>repnum)\n"
+ " |\n"
+ " [\\w:!-]\n"
+ " )*\n"
+ " |\n"
+ " \\#(?P>short_val)*\n"
+ " )\n"
+ " |\n"
+ " (?P<long_attr>\n"
+ " \\[\n"
+ " (?P<attr_pair>\n"
+ " (?P<attr_name>\n"
+ " \\\\(?:\\\\{2})*[\"'\\s]\n"
+ " |\n"
+ " [^\\[\\]\"'\\s\\\\]\n"
+ " )+\n"
+ " \\.?\n"
+ " (?P<equal_val>\n"
+ " =\n"
+ " (?P<attr_val>\n"
+ " (?P<unquoted_val>\n"
+ " \\\\(?:\\\\{2})*[\\[\\]\"'\\s]\n"
+ " |\n"
+ " [^\\[\\]\"'\\s\\\\]\n"
+ " )+\n"
+ " |\n"
+ " (?P<quoted_val>\n"
+ " (?P<quote>[\"'])\n"
+ " (?:\n"
+ " (?P<escaped_all>\\\\(?:\\\\{2})*.)\n"
+ " |\n"
+ " [^\"'\\n\\\\]\n"
+ " )*\n"
+ " (?P=quote)\n"
+ " )\n"
+ " )?\n"
+ " )?\n"
+ " )?\n"
+ " (?:\\s+(?P>attr_pair))*\n"
+ " \\]\n"
+ " )\n"
+ " )*\n"
+ " |\n"
+ " (?P>attr)+\n"
+ " )\n"
+ " (?P<tag_rest>\n"
+ " (?P<text>\n"
+ " \\{\n"
+ " (?P<text_content>\n"
+ " (?P>escaped_all)\n"
+ " |\n"
+ " [^\\{\\}\\n\\\\]\n"
+ " )*\n"
+ " \\}\n"
+ " )\n"
+ " (?P>attr)*\n"
+ " (?:\n"
+ " (?P<rep>\\*\\d*+)?\n"
+ " (?P>attr)*\n"
+ " (?P<close>\\/)?\n"
+ " |\n"
+ " (?P>close)?\n"
+ " (?P>rep)?\n"
+ " )\n"
+ " |\n"
+ " (?P>rep)\n"
+ " (?P>attr)*\n"
+ " (?P>text)?\n"
+ " (?P>attr)*\n"
+ " (?P>close)?\n"
+ " |\n"
+ " (?P>close)\n"
+ " (?P>rep)?\n"
+ " )?\n"
+ " |\n"
+ " (?P<text_first>(?P>text)(?P>attr)*)\n"
+ " (?P<text_rest>\n"
+ " (?P>rep)\n"
+ " (?P>attr)*\n"
+ " (?P>close)?\n"
+ " |\n"
+ " (?P>close)\n"
+ " (?P>rep)?\n"
+ " )?\n"
+ " )\n"
+ " (?:\n"
+ " (?P<relation>[>+]|\\^+)\n"
+ " (?P>group)*\n"
+ " )?\n"
+ " )\n"
+ "|\n"
+ " \\(\n"
+ " (?P>group)*\n"
+ " \\)\n"
+ " (?P>rep)?\n"
+ " (?P>relation)?\n"
+ ")+\n"
+ "$";
final String string = ">>> tag <<<\n"
+ "tag\n"
+ "$\n"
+ "tag$with$@^^^-2repnum\n"
+ "1\n"
+ "1/2\n"
+ "1/2/3\n"
+ "tag1/2with1/2/3fraction\n"
+ "tag$@with1/2both\n"
+ "ri:a\n"
+ "!\n"
+ "!!!\n"
+ "-\n"
+ ":\n\n"
+ "===XXX===\n"
+ "@\n"
+ "&\n\n"
+ ">>> short attr <<<\n"
+ "#\n"
+ "###\n"
+ "#id\n"
+ "#id1#id2\n"
+ "#id$@^^^-2\n"
+ ".\n"
+ ".#\n"
+ "...\n"
+ ".class\n"
+ ".class1.class2\n"
+ ".class#id.class\n"
+ ".class$@^-2type\n"
+ ".class-data\n"
+ ".!class\n"
+ ".class:subclass\n\n"
+ "===XXX===\n"
+ ".@\n"
+ ".汉字\n\n"
+ ">>> long attr <<<\n"
+ "[]\n"
+ "[key]\n"
+ "[key.]\n"
+ "[key...]\n"
+ "[key=]\n"
+ "[key.=]\n"
+ "[key=val]\n"
+ "[key.=val]\n"
+ "[key='val']\n"
+ "[key='val with space']\n"
+ "[key='val\\\\\\'ue']\n"
+ "[key1=val1 key2=val2]\n"
+ "[][]\n"
+ "[key][key]\n"
+ ".class[key]\n"
+ "[key].class\n"
+ "[汉字=汉字]\n\n"
+ "===XXX===\n"
+ "[\\[]\n"
+ "[key='val\\\\'ue']\n\n"
+ ">>> text <<<\n"
+ "{}\n"
+ "{text}\n"
+ "{text with space}\n"
+ "{text with escaped \\{ and \\}}\n"
+ "{汉字}\n"
+ "tag{text}\n"
+ ".attr{text}\n"
+ "{text}.attr\n\n"
+ "===XXX===\n"
+ "{\\\\{}\n"
+ "{{}}\n\n"
+ ">>> repeater <<<\n"
+ "tag*2\n"
+ ".attr*2\n"
+ "{text}*2\n"
+ ".attr{text}*2\n"
+ ".attr{text}.attr*2\n\n"
+ "===XXX===\n"
+ "*2\n"
+ "tag*2*2\n\n"
+ ">>> self-close <<<\n"
+ "tag/\n"
+ ".attr/\n"
+ "{text}/\n"
+ "tag*2/\n"
+ "tag/*2\n"
+ ".attr{text}.attr/\n"
+ ".attr*2.attr{text}.attr/\n"
+ ".attr{text}.attr*2.attr/\n"
+ ".attr{text}/*2\n"
+ "tag*2{text}/\n\n"
+ "===XXX===\n"
+ "/*2\n"
+ "tag//\n\n"
+ ">>> child <<<\n"
+ "tag>tag\n"
+ "tag.class*2>tag[key]/\n"
+ "tag>\n\n"
+ "===XXX===\n"
+ ">tag\n"
+ "tag>>\n\n"
+ ">>> sibling <<<\n"
+ "tag+tag\n"
+ ".class/>[key]+.attr/*2\n"
+ "tag[key]tag\n"
+ "tag{text}tag\n"
+ "tag*2tag\n"
+ "tag/tag\n\n"
+ "===XXX===\n"
+ "+tag\n"
+ "tag++\n\n"
+ ">>> parent <<<\n"
+ "tag^tag\n"
+ "tag^^^\n"
+ "tag>tag+tag^tag\n\n"
+ "===XXX===\n"
+ "^tag\n\n"
+ ">>> group <<<\n"
+ "()\n"
+ "(())\n"
+ "(tag)\n"
+ "(tag)(tag)\n"
+ "((tag)(tag))\n"
+ "tag>(tag.class)\n"
+ "tag>(tag>tag+tag)\n"
+ "(tag>(tag+tag)*2)*2\n"
+ "(tag)tag\n"
+ "(tag>).class\n"
+ "(tag)*2^tag\n"
+ "(tag*2)^tag\n"
+ "(tag>)^tag\n"
+ "(tag)^\n\n"
+ "===XXX===\n"
+ "(\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