Swift reemplace la expresión regular de la subcadena

Estoy intentando utilizar la expresión regular para replace todas las apariciones de loggings de automobilees en el Reino Unido dentro de una cadena.

El siguiente código rápido funciona perfectamente cuando la cadena coincide con la expresión regular exactamente como se muestra a continuación.

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) 

El resultado es XX

Sin embargo, lo siguiente no funciona y la cadena no se modifica

 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) 

El resultado es my car reg 1 - DD11 AAA my car reg 2 - AA22 BBB

¿Alguien puede darme algún consejo?

Debes eliminar los anclajes ^ y $ .

El ^ significa inicio de cadena y $ significa final de cadena (o línea, según las opciones). Es por eso que su primer ejemplo funciona: en la primera cadena de testing, el comienzo de la cadena realmente sigue su patrón y termina con ella.

En la segunda cadena de testing, el patrón se encuentra en el medio de la cadena, por lo tanto, ^... no se puede aplicar. Si acaba de eliminar el ^ , el $ se aplicaría en la segunda aparición del número de logging y la salida sería 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: NSRegularExpressionOptions.CaseInsensitive) let range = NSMakeRange(0, myString.characters.count) let modString = regex.stringByReplacingMatchesInString(myString, options: [], range: range, withTemplate: "XX") print(modString) // Output: "my car reg 1 - XX my car reg 2 - XX" 

Actualización para 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) } 

Usemos una extensión de class para resumir esto en la syntax de Swift 3:

 extension String { mutating func stringByRemovingRegexMatches(pattern: String, replaceWith: String = "") { do { let regex = try NSRegularExpression(pattern: pattern, options: NSRegularExpression.Options.caseInsensitive) let range = NSMakeRange(0, self.characters.count) self = regex.stringByReplacingMatches(in: self, options: [], range: range, withTemplate: replaceWith) } catch { return } } } var number = "+1 07777777777" number.stringByRemovingRegexMatches(pattern: "\\+\\d{1,4} (0)?") 

Resultados en 7777777777 (eliminando así el código de país del número de teléfono)

Con pattern: "^ ... $" ha especificado que el patrón está anclado al inicio y al final de la cadena, en otras palabras, toda la cadena debe coincidir con el patrón. Simplemente quite ^ y $ del patrón y obtendrá el resultado esperado.

swift3 12345678 a 1234 5678

 extension String { func codeFormat() -> String { let newStr = NSMutableString() for i in 0..<self.length { if (i > 0 && i % 4 == 0){ newStr.append(" ")} var c = self.NS.character(at: i) newStr.append(NSString(characters: &c, length: 1) as String) } return newStr as String}}