import Foundation
let pattern = ##"((?<=[ )()']where)|(?<=[ )()']and)|(?<=[ )()']o[rn])|(?<=[ )()']if)|(?<=[ )()']when)|(?<=having))+(\s|\()+[)(,'+_¥£$#\@\w\[\]\.\s]+like\s*\(?\s*(('((\w|%|'{2})*)')\s*\+)*\s*@p\d+\s*(\+('%'))*\)"##
let regex = try! NSRegularExpression(pattern: pattern, options: .caseInsensitive)
let testString = ##"""
select * from a where #myTable$@_¥£.$@_¥£#columnName like ('%'+@p2+'%')
select * from a where #myTable$_¥£.$_¥£#columnName like ('%'+@p2+'%')
(\w|\[|\]|\.|\s|'|\+|\(|\)|\,)
select a from b where h like ('%'+@p2+'%')
having b.d like ('%'+@p2)
)join c on a.b like (@p2+'%')
and a.b like (@p2)
if a like ('%abc24''as'+@p2+'%')
case when a like ('%'+@p2+'%')
where (((a like ('%'+ @p2+'%'))))
where a + 'b' like ('%'+@p2+'%')
where concat(a,b) like ('%'+@p2+'%') or ltrim(a) like ('%'+@p2+'%')
select * from a where concat(a,b) like 'a' and c like d or ltrim(a) like ('%'+@p2+'%')
where isnull(ltrim(a), '0') like ('%'+@p2+'%')
where a + 'b' LIKe ('%'+@p2+'%')
vICM_EVENTlike roadshowev0like_ where upper(roadshowev0like_.EVENT_NAME) like ('%'+@p1+'%') or upper(roadshowev0like_.EVENT_SYMBOLlike) like ('%'+@p2+'%') and e_.EVENT_SYMBOLike like('%'+@p2+'%')
from vICM_INVESTOR investor0_ where (upper(investor0_.OrgId) like ('%'+@p1+'%') or upper(investor0_.Name) like ('%'+@p2+'%')) and investor0_.IsDeactivated=@p3 order by investor0_.Name asc
where ((h.g) + upper(concat(investor0_.OrgId, 'd') + (a.d)) like ('%'+@p1+'%')
or upper(investor0_.Name) like ('%'+@p2+'%')) and investor0_.IsDeactivated=@p3 order by investor0_.Name asc
where (a.b like ('%'+@p2+'%')) and d.g like ('%'+@p2+'%')
(where a.b like ('%'+@p2)
if a like ('%'+@p2)
join a on b.d like ('%'+@p2)
// not supported
where a like 'b' and c like ('%'+@p2+'%')
where a like (' '+@p1+'%')
// supported
where a like ('%'+@p1+'%') and c like ('%'+@p2+'%')
"""##
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