import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Example {
public static void main(String[] args) {
final String regex = "^(>*([=*_]) # Match a separator type and put it in group 2, group 1 will contain the whole seperator so that we can \"backreference\" it in the closing tag\n"
+ "\\2{3} # It needs to be at least 4 long let's say (1 + 3)\n"
+ "(?:\\2|[\\r\\n])+) # Let's now support also newlines for \"multi line seperators\"\n"
+ "([\\s\\S]+?) # Match the content and put it in group 3\n"
+ "\\1";
final String string = "This is some text that should not be matched. As you can see, it is not enclosed\n"
+ "by separator lines.\n\n"
+ "===========================================================\n"
+ "This part should be matched as it is between two separator lines. Note that the\n"
+ "opening and closing separators are composed of the exact same number of the same\n"
+ "character.\n"
+ "===========================================================\n"
+ "This block should not be matched as it is not enclosed by its own separators,\n"
+ "but rather the closing separator of the previous block and the opening \n"
+ "separator of the next block.\n"
+ "===========================================================\n"
+ "It is tricky to distinguish between an enclosed and non-enclosed blocks, because\n"
+ "sometimes a matching pair of separators appears to be legal, while it is really\n"
+ "the closing separator of the previous block and the opening separator of the\n"
+ "next one (e.g. the block obove this one).\n"
+ "===========================================================\n"
+ "==================================\n"
+ "=====\n"
+ "This block is enclosed by multiline separators.\n"
+ "==================================\n"
+ "=====\n"
+ "Some more text that should not be matched by the regex.\n"
+ "***************************************\n\n\n\n"
+ "A separator can be a different character, for example the asterisk.\n\n\n"
+ "***************************************\n"
+ "***************************************\n"
+ "*******************\n"
+ "Another example of a multiline separated block.\n"
+ "***************************************\n"
+ "*******************\n\n"
+ ">Even more text not to be matchedby the regex. This time, preceeded by a\n"
+ ">variable number of '>'.\n"
+ ">>__________________________________________\n"
+ ">>And another type of separator. The block is now also a part of a reply section\n"
+ ">>of the email.\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