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}}
- 如何在xcode 7中使用Swift 2.0中的NSRegularExpression
- 标签和提及特殊字符的NSRegularExpression?
- 电话号码格式应该是国际性的,在iPhone中是否有用于电话号码validation的正则expression式
- 使用正则expression式匹配emojis以及string中的文本
- 正则expression式支持多语言的hashtag文本
- 电子邮件使用特殊字符的正则expression式问题
- Cocoa错误2048在cocoa中使用NSRegularExpression
- 如何在iOS中validation美国或加拿大的Zipcode?
- 检查string是否包含Swift中的特殊字符