Dans Swift, quel est un moyen simple de voir si une chaîne correspond à un modèle?
Exemples de pseudocode:
if string matches pattern ...
if string =~ pattern ...
(J'ai lu les documents Swift et je n'ai pas vu de capacité d'expression régulière. J'ai lu comment ajouter un nouveau =~
opérateur qui est une bonne idée mais plus complexe que je ne le souhaiterais car il s'agit d'un projet pédagogique. J'ai essayé rangeOfString
mais j'obtiens l'erreur: 'String' n'a pas de membre 'rangeOfString'. Je recherche une solution Swift, c'est-à-dire sans taper NSRegularExpression. Je n'ai rien à faire avec les données de résultat de correspondance.)
Solution Swift version 3:
if string.range(of: regex, options: .regularExpression, range: nil, locale: nil) != nil ...
Solution Swift version 2:
if string.rangeOfString(pattern, options: .RegularExpressionSearch) != nil ...
Exemple - cette chaîne contient-elle deux caractères "o"?
"hello world".rangeOfString("o.*o", options: .RegularExpressionSearch) != nil
Remarque: Si vous obtenez le message d'erreur 'String' does not have a member 'rangeOfString'
, puis ajoutez ceci avant: import Foundation
. Cela est dû au fait que Foundation fournit les méthodes NSString qui sont automatiquement reliées à la classe String Swift.
import Foundation
Merci à Onno Eberhard pour la mise à jour Swift 3.
Les solutions mentionnées ci-dessus ne fonctionnaient plus pour moi, donc je poste ma solution ici (j'ai utilisé une extension pour String):
extension String {
func matches(_ regex: String) -> Bool {
return self.range(of: regex, options: .regularExpression, range: nil, locale: nil) != nil
}
}
Exemple:
if str.matches("^[a-zA-Z0-9._-]{1,30}$") {
//...
}
Pour obtenir la syntaxe que vous demandez réellement, vous pouvez facilement définir un nouvel opérateur qui encapsule la fonctionnalité NSString
pontée:
infix operator =~ {}
func =~(string:String, regex:String) -> Bool {
return string.rangeOfString(regex, options: .RegularExpressionSearch) != nil
}
"abcd" =~ "ab*cd"
"abcd" =~ "abcde+"