Swiftreplace子string正则expression式

我正在尝试使用正则expression式来replace所有出现在string中的英国汽车注册。

下面的swift代码完美地适用于string正确匹配正则expression式的情况。

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) 

结果是XX

但是,以下不起作用,string不被修改

 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) 

结果是my car reg 1 - DD11 AAA my car reg 2 - AA22 BBB

任何人都可以给我任何指针?

你需要删除^$锚。

^表示string的开始, $表示string的结尾 (或行,取决于选项)。 这就是为什么你的第一个例子的工作原理:在第一个testingstring中,string的开头紧跟着你的模式,并以它结束。

在第二个testingstring中,模式位于string的中间,因此^...不能应用。 如果你只是删除^$将适用于第二次登记号码和输出将是my car reg 1 - DD11 AAA my car reg 2 - XX登记my car reg 1 - DD11 AAA my car reg 2 - XX登记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" 

让我们使用一个类扩展来将其包装在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)?") 

结果在7777777777 (因此从电话号码中删除国家代码)

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

使用pattern: "^ ... $"您已经指定模式被锚定到string的开头和结尾,换句话说, 整个string必须匹配模式。 只要从模式中删除^$ ,就可以得到预期的结果。

swift3 12345678至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}}