import Foundation
let pattern = ##"^[^.#,]*[.#,].*?\bMY_STRING\b[^,\r\n]*;(?:video|comment)(*SKIP)(*FAIL)|\bMY_STRING\b"##
let regex = try! NSRegularExpression(pattern: pattern, options: .anchorsMatchLines)
let testString = ##"""
[1]
text,MY_STRING ;comment
text,MY_STRING text ;comment
text,text MY_STRING text ;comment
--------------------------------------------------------------
-> dont catch any above because exist a
**comma** before #MY_STRING# and ;comment after.
--------------------------------------------------------------
[2]
text, MY_STRING , text ;comment
--------------------------------------------------------------
-> catch because exist a **comma** after #MY_STRING#
--------------------------------------------------------------
[3]
text, MY_STRING, MY_STRING ;comment
--------------------------------------------------------------
-> catch first #MY_STRING# but don't catch last #MY_STRING#
because she is between , and ;comment
--------------------------------------------------------------
[4]
MY_STRING
MY_STRING,text
text, MY_STRING,
MY_STRING ;comment
text MY_STRING ;comment
text,MY_STRING,text ;comment
%MY_STRING% , (MY_STRING)
--------------------------------------------------------------
-> catch all, because there's no [comma . #] preceding #MY_STRING#
and no [# ;comment ;video] succeeding
--------------------------------------------------------------
[5]
.MY_STRING
#MY_STRING
MY_STRING#
--------------------------------------------------------------
- > dont catch any
Independent of where MY_STRING is, either what it has between, don't catch any, because they have . or # preceding/proceeding the string.
--------------------------------------------------------------
[6]
MY_STRING, .MY_STRING, #MY_STRING, text, MY_STRING
text, MY_STRING#, MY_STRING, .MY_STRING
--------------------------------------------------------------
-> same as above, just catch MY_STRING samples not containing . #
--------------------------------------------------------------
[7]
text, MY_STRING ;video
MY_STRING ;video
#MY_STRING, MY_STRING, text, text MY_STRING ;video
--------------------------------------------------------------
- > In this case, the string will not be caught independent of where it is or what it has preceding/succeeding because exist the string ;video at the ending.
--------------------------------------------------------------
[8]
text,MY_STRING, text ;comment
^ ok catch (reason explained above)
--------------------------------------------------------------
[9]
text,MY_STRING@ text ;comment
-------------------------------------------------------------- ^ dont catch, because there's no comma after the string, and there's a comma before and ;comment after
--------------------------------------------------------------
[10]
MY_STRING,text,#MY_STRING,text,text,%MY_STRING% @ $text #text <text> ;comment
^[1] ^[2] ^[3]
--------------------------------------------------------------
[1] catch
[2] don't (# preceding)
[3] don't catch, because there's a comma preceding, no comma succeding and at the end line exist the string ;comment
--------------------------------------------------------------
[11]
.MY_STRING,text,MY_STRING,text,text,%MY_STRING% @ $text, #text <text> ;comment
^[1] ^[2] ^[3] ^[4]
--------------------------------------------------------------
[1] don't (dot preceding)
[2] catch
[3] catch because there's a comma on [4] so the string is not anymore between a comma preceding and ;comment succeeding, she is now between a comma preceding a comma succeeding and ;comment
"""##
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