import Foundation
let pattern = #" *(?:.*\S.*\n)+\n? *: +(?:.|\n)+?(?:\n{2,}(?=\S)(?! *: +)(?! *(?:\S.*\n)+?\n? *: +)|$)"#
let regex = try! NSRegularExpression(pattern: pattern)
let testString = #"""
=== Single <dt> and <dd>
GitHub
: a site where over 73 million developers shape the future of software, together
=== Multiple <dt>-<dd> group
Firefox
: a free, open source, cross-platform, graphical web browser developed by the Mozilla Corporation and hundreds of volunteers
MDN
: provides information about Open Web technologies including HTML, CSS, and APIs for both Web sites and progressive web apps
=== Single <dt> with multiple <dd>s
Apple
: an American multinational technology company that specializes in consumer electronics, computer software and online services.
: an edible fruit produced by an apple tree
=== Multiple <dt>s
Windows
Microsoft Windows
Win
: a group of several proprietary graphical operating system families, all of which are developed and marketed by Microsoft
=== separated by blank lines
Solaris
: a 1961 science fiction novel by Polish writer Stanisław Lem
: a proprietary Unix operating system originally developed by Sun Microsystems
=== <dd>s with inline breaks
Oracle
: an American multinational computer technology
corporation headquartered in Austin, Texas
: the priest or priestess uttering the prediction,
may also refer to the site of the oracle
===
😂
: 😂 face with tears of joy
===
Term 1
: This is a definition with two paragraphs. Lorem ipsum
dolor sit amet, consectetuer adipiscing elit. Aliquam
hendrerit mi posuere lectus.
Vestibulum enim wisi, viverra nec, fringilla in, laoreet
vitae, risus.
: Second definition for term 1, also wrapped in a paragraph
because of the blank line preceding it.
Term 2
: This definition has a code block, a blockquote and a list.
code block.
> block quote
> on two lines.
1. first list item
2. second list item
"""#
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