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