Swift Language
NSRegularExpression in Swift
Zoeken…
Opmerkingen
Speciale tekens
*?+[(){}^$|\./
String uitbreiden om eenvoudig patroonvergelijking uit te voeren
extension String {
func matchesPattern(pattern: String) -> Bool {
do {
let regex = try NSRegularExpression(pattern: pattern,
options: NSRegularExpressionOptions(rawValue: 0))
let range: NSRange = NSMakeRange(0, self.characters.count)
let matches = regex.matchesInString(self, options: NSMatchingOptions(), range: range)
return matches.count > 0
} catch _ {
return false
}
}
}
// very basic examples - check for specific strings
dump("Pinkman".matchesPattern("(White|Pinkman|Goodman|Schrader|Fring)"))
// using character groups to check for similar-sounding impressionist painters
dump("Monet".matchesPattern("(M[oa]net)"))
dump("Manet".matchesPattern("(M[oa]net)"))
dump("Money".matchesPattern("(M[oa]net)")) // false
// check surname is in list
dump("Skyler White".matchesPattern("\\w+ (White|Pinkman|Goodman|Schrader|Fring)"))
// check if string looks like a UK stock ticker
dump("VOD.L".matchesPattern("[A-Z]{2,3}\\.L"))
dump("BP.L".matchesPattern("[A-Z]{2,3}\\.L"))
// check entire string is printable ASCII characters
dump("tab\tformatted text".matchesPattern("^[\u{0020}-\u{007e}]*$"))
// Unicode example: check if string contains a playing card suit
dump("♠︎".matchesPattern("[\u{2660}-\u{2667}]"))
dump("♡".matchesPattern("[\u{2660}-\u{2667}]"))
dump("😂".matchesPattern("[\u{2660}-\u{2667}]")) // false
// NOTE: regex needs Unicode-escaped characters
dump("♣︎".matchesPattern("♣︎")) // does NOT work
Hieronder is een ander voorbeeld dat voortbouwt op het bovenstaande om iets nuttigs te doen, dat niet gemakkelijk kan worden gedaan met een andere methode en zich goed leent voor een regex-oplossing.
// Pattern validation for a UK postcode.
// This simply checks that the format looks like a valid UK postcode and should not fail on false positives.
private func isPostcodeValid(postcode: String) -> Bool {
return postcode.matchesPattern("^[A-Z]{1,2}([0-9][A-Z]|[0-9]{1,2})\\s[0-9][A-Z]{2}")
}
// valid patterns (from https://en.wikipedia.org/wiki/Postcodes_in_the_United_Kingdom#Validation)
// will return true
dump(isPostcodeValid("EC1A 1BB"))
dump(isPostcodeValid("W1A 0AX"))
dump(isPostcodeValid("M1 1AE"))
dump(isPostcodeValid("B33 8TH"))
dump(isPostcodeValid("CR2 6XH"))
dump(isPostcodeValid("DN55 1PT"))
// some invalid patterns
// will return false
dump(isPostcodeValid("EC12A 1BB"))
dump(isPostcodeValid("CRB1 6XH"))
dump(isPostcodeValid("CR 6XH"))
Basisgebruik
Er zijn verschillende overwegingen bij het implementeren van reguliere expressies in Swift.
let letters = "abcdefg"
let pattern = "[a,b,c]"
let regEx = try NSRegularExpression(pattern: pattern, options: [])
let nsString = letters as NSString
let matches = regEx.matches(in: letters, options: [], range: NSMakeRange(0, nsString.length))
let output = matches.map {nsString.substring(with: $0.range)}
//output = ["a", "b", "c"]
Om een nauwkeurige bereiklengte te krijgen die alle tekensoorten ondersteunt, moet de invoertekenreeks worden geconverteerd naar een NSString.
Voor veiligheidsafstemming moet een patroon worden ingesloten in een do catch-blok om storingen te behandelen
let numbers = "121314"
let pattern = "1[2,3]"
do {
let regEx = try NSRegularExpression(pattern: pattern, options: [])
let nsString = numbers as NSString
let matches = regEx.matches(in: numbers, options: [], range: NSMakeRange(0, nsString.length))
let output = matches.map {nsString.substring(with: $0.range)}
output
} catch let error as NSError {
print("Matching failed")
}
//output = ["12", "13"]
Reguliere expressiefunctionaliteit wordt vaak in een extensie of helper geplaatst om zorgen te scheiden.
Substrings vervangen
Patronen kunnen worden gebruikt om een deel van een invoertekenreeks te vervangen.
In het onderstaande voorbeeld wordt het centsymbool vervangen door het dollarsymbool.
var money = "¢¥€£$¥€£¢"
let pattern = "¢"
do {
let regEx = try NSRegularExpression (pattern: pattern, options: [])
let nsString = money as NSString
let range = NSMakeRange(0, nsString.length)
let correct$ = regEx.stringByReplacingMatches(in: money, options: .withTransparentBounds, range: range, withTemplate: "$")
} catch let error as NSError {
print("Matching failed")
}
//correct$ = "$¥€£$¥€£$"
Speciale tekens
Voor speciale tekens moet Double Backslash worden gebruikt \. becomes \\.
Tekens die je moet ontsnappen zijn onder andere
(){}[]/\+*$>.|^?
Het onderstaande voorbeeld krijgt drie soorten openingsbeugels
let specials = "(){}[]"
let pattern = "(\\(|\\{|\\[)"
do {
let regEx = try NSRegularExpression(pattern: pattern, options: [])
let nsString = specials as NSString
let matches = regEx.matches(in: specials, options: [], range: NSMakeRange(0, nsString.length))
let output = matches.map {nsString.substring(with: $0.range)}
} catch let error as NSError {
print("Matching failed")
}
//output = ["(", "{", "["]
bevestiging
Reguliere expressies kunnen worden gebruikt om invoer te valideren door het aantal overeenkomsten te tellen.
var validDate = false
let numbers = "35/12/2016"
let usPattern = "^(0[1-9]|1[012])[-/.](0[1-9]|[12][0-9]|3[01])[-/.](19|20)\\d\\d$"
let ukPattern = "^(0[1-9]|[12][0-9]|3[01])[-/](0[1-9]|1[012])[-/](19|20)\\d\\d$"
do {
let regEx = try NSRegularExpression(pattern: ukPattern, options: [])
let nsString = numbers as NSString
let matches = regEx.matches(in: numbers, options: [], range: NSMakeRange(0, nsString.length))
if matches.count > 0 {
validDate = true
}
validDate
} catch let error as NSError {
print("Matching failed")
}
//output = false
NSRegularExpression voor e-mailvalidatie
func isValidEmail(email: String) -> Bool {
let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"
let emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
return emailTest.evaluate(with: email)
}
of je zou de String-extensie als volgt kunnen gebruiken:
extension String
{
func isValidEmail() -> Bool {
let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"
let emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
return emailTest.evaluate(with: self)
}
}