import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Example {
public static void main(String[] args) {
final String regex = "# you define first the basic elements (as for a lexer) with named groups\n"
+ "(?(DEFINE)\n"
+ "(?<var> [a-z_]\\w*)\n\n"
+ "(?<dqstr> (?<=\") [^\\\\\"]*+ (?s:\\\\.[^\\\\\"]*)*+ (?=\") )\n"
+ "(?<sqstr> (?<=') [^\\\\']*+ (?s:\\\\.[^\\\\']*)*+ (?=') )\n"
+ "(?<string> \\g<dqstr> | \\g<sqstr> )\n\n"
+ "(?<num> [0-9]+(?:\\.[0-9]+)? )\n\n"
+ "(?<value> \\g<string> | \\g<num> )\n\n"
+ "(?<comp> [!><=]= | =?[><])\n"
+ ")\n\n"
+ "# Then you write the pattern using these named groups\n\n"
+ "(?J) # allow duplicate named groups\n\n"
+ "# variable op value\n"
+ "(?<key> \\g<var> ) \\h* \\g<comp> \\h* [\"']?(?<val> \\g<value>) [\"']?\n"
+ "| # OR\n"
+ "# value op variable\n"
+ "[\"']?(?<val> \\g<value>) [\"']? \\h* \\g<comp> \\h* (?<key> \\g<var> )\n";
final String string = "type == 'prova' && padposition == \"stefano\" or 10>var_name";
final Pattern pattern = Pattern.compile(regex, Pattern.COMMENTS | Pattern.CASE_INSENSITIVE);
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