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?
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"
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)
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)
}
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.
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)
}