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