import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Example {
public static void main(String[] args) {
final String regex = "(?xsm) # free-spacing mode, DOTALL, multi-line\n"
+ "(?=.*?blue) # if blue isn't there, fail without delay\n\n"
+ "########### LINE SKIPPER / COUNTER ############\n"
+ "(?: # start non-capture group\n"
+ " # the aim is to skip lines that don't contain blue\n"
+ " # and capture a corresponding digit sequence\n"
+ " (?: # skip one line that doesn't contain blue\n"
+ " ^ # beginning of line\n"
+ " (?:(?!blue)[^\\r\\n])* # zero or more chars\n"
+ " # that do not start blue\n"
+ " (?:\\r?\\n) # newline chars\n"
+ " ) \n"
+ "# With each line skipped, let Group 1 capture\n"
+ "# an ever-increasing portion of the string of numbers\n"
+ " (?= # lookahead\n"
+ " [^~]+ # skip all chars that are not tildes\n"
+ " ( # start Group 1\n"
+ " (?(1)\\1) # if Group 1 is set, match Group 1\n"
+ " # (?>\\1?) # alternate phrasing for the above\n"
+ " ~\\d+ # match a tilde and digits\n"
+ " ) # end Group 1\n"
+ " ) # end lookahead\n"
+ ")*+ # end counter-line-skipper: zero or more times\n"
+ " # the possessive + forbids backtracking\n\n\n"
+ ".*? # lazily match any chars up to...\n"
+ "blue # match blue\n"
+ "[^~]+ # match any non-tilde chars\n"
+ "(?(1)\\1) # if Group 1 has been set, match it\n"
+ "# \\1? # alternate phrasing for the above\n"
+ "~ # match a tilde\n"
+ "\\K # drop what we matched so far\n"
+ "\\d+ # match digits. This is the match! ";
final String string = "Paint it white\n"
+ "Paint it black\n"
+ "Why not blue?\n"
+ "Or red or brown?\n\n"
+ "~1~2~3~4~5~6~7~8~9~10";
final Pattern pattern = Pattern.compile(regex);
final Matcher matcher = pattern.matcher(string);
if (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