web-dev-qa-db-fra.com

Swift remplacer la sous-chaîne regex

J'essaie d'utiliser l'expression régulière pour remplacer toutes les occurrences d'immatriculations de voitures au Royaume-Uni dans une chaîne.

Le code suivant Swift fonctionne parfaitement pour a lorsque la chaîne correspond exactement à l'expression rationnelle ci-dessous.

var myString = "DD11 AAA"
var stringlength = countElements(myString) 
var ierror: NSError?
var regex:NSRegularExpression = NSRegularExpression(pattern: "^([A-HK-PRSVWY][A-HJ-PR-Y])\\s?([0][2-9]|[1-9][0-9])\\s?[A-HJ-PR-Z]{3}$", options: NSRegularExpressionOptions.CaseInsensitive, error: &ierror)!
var modString = regex.stringByReplacingMatchesInString(myString, options: nil, range: NSMakeRange(0, stringlength), withTemplate: "XX")
print(modString)

Le résultat est XX

Cependant, ce qui suit ne fonctionne pas et la chaîne n'est pas modifiée

var myString = "my car reg 1 - DD11 AAA  my car reg 2 - AA22 BBB"
var stringlength = countElements(myString) 
var ierror: NSError?
var regex:NSRegularExpression = NSRegularExpression(pattern: "^([A-HK-PRSVWY][A-HJ-PR-Y])\\s?([0][2-9]|[1-9][0-9])\\s?[A-HJ-PR-Z]{3}$", options: NSRegularExpressionOptions.CaseInsensitive, error: &ierror)!
var modString = regex.stringByReplacingMatchesInString(myString, options: nil, range: NSMakeRange(0, stringlength), withTemplate: "XX")
print(modString)

Le résultat est my car reg 1 - DD11 AAA my car reg 2 - AA22 BBB

Quelqu'un peut-il me donner des indications?

31
jjc99

Vous devez supprimer le ^ et $ ancres.

Le ^ signifie début de la chaîne et $ signifie fin de chaîne (ou ligne, selon les options). C'est pourquoi votre premier exemple fonctionne: dans la première chaîne de test, le début de la chaîne est vraiment suivi de votre modèle et se termine par lui.

Dans la deuxième chaîne de test, le motif se trouve au milieu de la chaîne, donc le ^... ne peut pas postuler. Si vous supprimez simplement le ^, le $ s'appliquerait à la deuxième occurrence du numéro d'enregistrement et la sortie serait my car reg 1 - DD11 AAA my car reg 2 - XX.

let myString = "my car reg 1 - DD11 AAA  my car reg 2 - AA22 BBB"
let regex = try! NSRegularExpression(pattern: "([A-HK-PRSVWY][A-HJ-PR-Y])\\s?([0][2-9]|[1-9][0-9])\\s?[A-HJ-PR-Z]{3}", options: NSRegularExpression.Options.caseInsensitive)
let range = NSMakeRange(0, myString.count)
let modString = regex.stringByReplacingMatches(in: myString, options: [], range: range, withTemplate: "XX")
print(modString)
// Output: "my car reg 1 - XX  my car reg 2 - XX"
41
DarkDust

Utilisons une extension de classe pour envelopper cela dans la syntaxe Swift 3:

extension String {
    mutating func removingRegexMatches(pattern: String, replaceWith: String = "") {
        do {
            let regex = try NSRegularExpression(pattern: pattern, options: NSRegularExpression.Options.caseInsensitive)
            let range = NSMakeRange(0, self.count)
            self = regex.stringByReplacingMatches(in: self, options: [], range: range, withTemplate: replaceWith)
        } catch {
            return
        }
    }
}

var phoneNumber = "+1 07777777777"
phoneNumber.removingRegexMatches(pattern: "\\+\\d{1,4} (0)?")

Résulte en 7777777777 (supprimant ainsi le code du pays du numéro de téléphone)

19
Ryan Brodie

Mise à jour pour Swift 2.1:

var myString = "my car reg 1 - DD11 AAA  my car reg 2 - AA22 BBB"
if let regex = try? NSRegularExpression(pattern: "([A-HK-PRSVWY][A-HJ-PR-Y])\\s?([0][2-9]|[1-9][0-9])\\s?[A-HJ-PR-Z]{3}", options: .CaseInsensitive) {
    let modString = regex.stringByReplacingMatchesInString(myString, options: .WithTransparentBounds, range: NSMakeRange(0, myString.characters.count), withTemplate: "XX")
    print(modString)
}
9
Daniel J

Avec pattern: "^ ... $" vous avez spécifié que le modèle est ancré au début et à la fin de la chaîne, en d'autres termes, la chaîne entière doit correspondre au modèle. Il suffit de supprimer ^ et $ du modèle et vous obtiendrez le résultat attendu.

4
Martin R

Swift 4.2 mis à jour

let myString = "my car reg 1 - DD11 AAA  my car reg 2 - AA22 BBB"
if let regex = try? NSRegularExpression(pattern: "([A-HK-PRSVWY][A-HJ-PR-Y])\\s?([0][2-9]|[1-9][0-9])\\s?[A-HJ-PR-Z]{3}", options: .caseInsensitive) {
    let modString = regex.stringByReplacingMatches(in: myString, options: [], range: NSRange(location: 0, length:  myString.count), withTemplate: "XX")
    print(modString)
}
2
black_pearl