import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Example {
public static void main(String[] args) {
final String regex = "(?<!```html\\s*)(<link href=.*?)(?=^\\s*$)";
final String string = "\n"
+ "# PATTERNS\n\n"
+ "## Style Blocks (2 patterns)\n"
+ "- ***Matches:***\n"
+ " - All `<style> any code here </style> blocks that aren't preceded by ```css + any amount of optional whitespace\n\n"
+ ">> NOTES FOR THE FOLLOWING PATTERN: \n"
+ " • This requires the `regex` library, not Python's built-in-crap\n"
+ " • This requires the `Single Line` (regex101) or `regex.DOTALL` (Python regex) flag\n\n"
+ "### Pattern: Old version (would have replaced all punctuation with `punctuation` from the string library)\n"
+ " (?<!```css\\s*)(\\<style\\>[\\sa-z0-9\\-\\.\\[\\{\\]\\}:;#]+\\<\\/style\\>)\n\n"
+ ">> NOTES FOR THE FOLLOWING PATTERN: \n"
+ " • This requires the `regex` library, not Python's built-in-crap\n"
+ " • This requires the `Single Line` (regex101) or `regex.DOTALL` (Python regex) flag\n\n"
+ "### Pattern: Newest version (much better)\n"
+ " (?<!```css\\s*)(<style>.*?<\\/style>)\n\n"
+ "## This does the same thing but for `<!DOCTYPE html> any code here </html>`\n\n"
+ ">> NOTES FOR THE FOLLOWING PATTERN: \n"
+ " • This requires the `regex` library, not Python's built-in-crap\n"
+ " • This requires the `Single Line` (regex101) or `regex.DOTALL` (Python regex) flag\n\n"
+ "### Pattern:\n"
+ " (?<!```html\\s*)(<!DOCTYPE html>.*?<\\/html>)\n\n"
+ "## This matches all blocks of code containing `<link href=>` up to, but not including, an empty line\n\n"
+ ">> NOTES FOR THE FOLLOWING PATTERN: \n"
+ " • This requires the `regex` library, not Python's built-in-crap\n"
+ " • This requires the `Single Line` (regex101) or `regex.DOTALL` (Python regex) flag\n\n"
+ "### Pattern:\n"
+ " (?<!```html\\s*)(<link href=.*?)(?=^\\s*$)\n\n"
+ "<br>\n\n"
+ "(><)(><)(><)(><)(><)(><)(><)(><)(><)(><)(><)(><)(><)(><)(><)(><)(><)(><)(><)(><)(><)(><)(><)(><)(><)(><)(><)(><)(><)(><)(><)(><)\n\n"
+ "<br>\n\n"
+ "# TEST TEXT\n\n"
+ "<br>\n\n"
+ "<style>\n"
+ " .list-group-mine .list-group-item {\n"
+ " background-color: black;\n"
+ " color: white;\n"
+ " border-top: 1px solid #0091b5;\n"
+ " border-left-color: #fff;\n"
+ " border-right-color: #fff;\n"
+ " }\n"
+ " .list-group-mine .list-group-item:hover {\n"
+ " background-color: red;\n"
+ " }\n"
+ "</style>\n\n\n"
+ "```css\n"
+ "<style>\n"
+ " .list-group-mine .list-group-item {\n"
+ " background-color: black;\n"
+ " color: white;\n"
+ " border-top: 1px solid #0091b5;\n"
+ " border-left-color: #fff;\n"
+ " border-right-color: #fff;\n"
+ " }\n"
+ " .list-group-mine .list-group-item:hover {\n"
+ " background-color: red;\n"
+ " }\n"
+ "</style>\n"
+ "```\n\n"
+ "<link href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\" rel=\"stylesheet\" integrity=\"sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u\" crossorigin=\"anonymous\">\n"
+ "<div class=\"list-group list-group-mine\">\n"
+ " <a class=\"list-group-item\" href=\"https://bit.ly/3SICqay\"><strong>Link to the SO Post</strong></a>\n"
+ " <a class=\"list-group-item\" href=\"/path\"><strong>Item 2</strong></a>\n"
+ " <a class=\"list-group-item\" href=\"/path\"><strong>Item 3</strong></a>\n"
+ "</div>\n\n"
+ "<br>\n\n"
+ "##### Before Bootstrap\n"
+ "<!DOCTYPE html>\n\n"
+ "<html lang=\"en\">\n"
+ " <head>\n"
+ " <title>TABLE</title>\n"
+ " </head>\n"
+ " <body>\n"
+ " <table>\n"
+ " <thead>\n"
+ " <tr>\n"
+ " <th>Name</th>\n"
+ " <th>Number</th>\n"
+ " </tr>\n"
+ " </thead>\n"
+ " <tbody>\n"
+ " <tr>\n"
+ " <td>Malachi</td>\n"
+ " <td>1-555-343-9867</td>\n"
+ " </tr>\n"
+ " <tr>\n"
+ " <td>Steve</td>\n"
+ " <td>1-555-734-8857</td>\n"
+ " </tr>\n"
+ " </tbody>\n"
+ " </table>\n"
+ " </body>\n"
+ "</html>\n\n\n"
+ "</br>\n\n"
+ "<code style=\"color: #f51686; font-weight: bold; font-size: 16pt;\"> The HTML </code>\n\n"
+ "```html\n"
+ " <!DOCTYPE html>\n"
+ " <html lang=\"en\">\n"
+ " <head>\n"
+ " <meta charset=\"UTF-8\" />\n"
+ " <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n"
+ " <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n"
+ " <title>CSS Images</title>\n"
+ " <link rel=\"stylesheet\" href=\"css/style.css\" />\n"
+ " </head>\n\n"
+ " <body>\n"
+ " <div class=\"container\">\n"
+ " <section class=\"hero\">\n"
+ " <figure class=\"profile-pic-figure\">\n"
+ " <img\n"
+ " src=\"img/profile-800x800.png\"\n"
+ " alt=\"profile\"\n"
+ " width=\"800\"\n"
+ " height=\"800\"\n"
+ " title=\"Profile Pic\"\n"
+ " />\n"
+ " <figcaption class=\"offscreen\">Pookie Scrumptious</figcaption>\n"
+ " </figure>\n"
+ " <h1 class=\"h1\">\n"
+ " <span class=\"nowrap\">\n"
+ " Hello 👋\n"
+ " </span>\n"
+ " <span class=\"nowrap\">\n"
+ " I'm Pookie\n"
+ " </span>\n"
+ " </h1>\n"
+ " </section>\n"
+ " </div>\n"
+ " </body>\n"
+ " </html>\n"
+ "```\n\n"
+ "<br>\n\n"
+ "<code style=\"color: #f51686; font-weight: bold; font-size: 16pt;\"> The CSS</code>\n";
final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE | Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
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