web-dev-qa-db-fra.com

Swift regex: une chaîne correspond-elle à un modèle?

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.)

30

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.

68

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}$") {
    //...
}
23
Onno Eberhard

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+"
12
David Berry