import Foundation
// WARNING: You included a flag that Swift doesn't support: X
// When this flag is set, it causes any backslash in the pattern that is followed by a letter that has no special meaning to cause an error.
// By default in Swift, a backslash followed by a letter with no special meaning will be treated as a literal.
let pattern = ##"""
(?(DEFINE)
(?<prepend>
(?>
\s++
| #multi-line comment by Jeffrey Friedl (fastest)
/\*
[^*]* \*+
(?:[^*/][^*]*\*+)*
/
| ;++
)*+
)
#https://www.postgresql.org/docs/11/sql-commands.html
(?<command>abort|alter|begin|cache|call|checkpoint|cluster|comment|commit|copy|create|deallocate|delete|discard|do|drop|execute|flush|grant|import\s++foreign\s++schema|insert|kill|load|lock|prepare|prepare\s++transaction|reassign\s++owned|refresh\s++materialized\s++view|release\s++savepoint|rename|replace|reset|revoke|rollback|select\s++into|set\s++constraints|start\s++transaction|truncate|update)
)
^
(?&prepend)
\K
(?&command)
\b
(?!
(?&prepend)
\( #REPLACE() function can be similar to command
)
"""##
let regex = try! NSRegularExpression(pattern: pattern, options: [.anchorsMatchLines, .caseInsensitive, .allowCommentsAndWhitespace, .dotMatchesLineSeparators])
let testString = #"""
WITH t1 AS (
-- UPDATE
/* INSERT */
SELECT *
FROM t
WHERE s =
REPLACE(s, 'a', 'b')
),
t2 AS (
-- комментарий UPDATE
/* INSERT
*/UPDATE--
* FROM t SET i = 1
RETURNING *
),
INSERT b
SELECT * FROM t2
"""#
let stringRange = NSRange(location: 0, length: testString.utf16.count)
if let firstMatch = regex.firstMatch(in: testString, range: stringRange) {
let result: [String] = (1 ..< firstMatch.numberOfRanges).map { (testString as NSString).substring(with: firstMatch.range(at: $0)) }
print(result)
} else {
print("No matches were found.")
}
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