Swift Language
NSRegularExpression dans Swift
Recherche…
Remarques
Caractères spéciaux
*?+[(){}^$|\./
Extension de la chaîne pour faire correspondre un modèle simple
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
Vous trouverez ci-dessous un autre exemple qui s'appuie sur ce qui précède pour faire quelque chose d'utile, qui ne peut être facilement fait par une autre méthode et se prête bien à une solution de regex.
// 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"))
Utilisation de base
Plusieurs considérations sont à prendre en compte lors de l'implémentation des expressions régulières dans 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"]
Afin d'obtenir une longueur de plage précise qui prend en charge tous les types de caractères, la chaîne d'entrée doit être convertie en une chaîne NSString.
Pour la sécurité, l'appariement par rapport à un modèle doit être inclus dans un bloc do catch pour gérer les défaillances
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"]
La fonctionnalité d'expression régulière est souvent placée dans une extension ou une aide pour séparer les problèmes.
Remplacement des sous-couches
Les motifs peuvent être utilisés pour remplacer une partie d'une chaîne d'entrée.
L'exemple ci-dessous remplace le symbole du cent par le symbole du dollar.
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$ = "$¥€£$¥€£$"
Caractères spéciaux
Pour faire correspondre des caractères spéciaux, vous devez utiliser une double barre oblique inverse \. becomes \\.
Les personnages que vous devrez échapper incluent
(){}[]/\+*$>.|^?
L'exemple ci-dessous comprend trois types de crochets
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 = ["(", "{", "["]
Validation
Les expressions régulières peuvent être utilisées pour valider les entrées en comptant le nombre de correspondances.
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 pour la validation du courrier
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)
}
ou vous pourriez utiliser l'extension de chaîne comme ceci:
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)
}
}