jjc*_*c99 32 regex xcode objective-c ios swift
我试图使用正则表达式来替换字符串中所有出现的英国汽车注册.
以下swift代码完全适用于字符串与正则表达式完全匹配时的情况.
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)
Run Code Online (Sandbox Code Playgroud)
结果是 XX
但是,以下操作无效,字符串未修改
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)
Run Code Online (Sandbox Code Playgroud)
结果是 my car reg 1 - DD11 AAA my car reg 2 - AA22 BBB
任何人都可以给我任何指示吗?
Dar*_*ust 43
你需要删除^和$锚点.
该^装置开始字符串和$表示字符串的结束(或线,这取决于选项).这就是你的第一个例子工作的原因:在第一个测试字符串中,字符串的开头实际上是你的模式,然后以它结束.
在第二个测试字符串中,模式位于字符串的中间,因此^...无法应用.如果你只是删除它^,$将适用于第二次出现的注册号,输出将是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"
Run Code Online (Sandbox Code Playgroud)
Rya*_*die 19
让我们使用类扩展来将它包装在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)?")
Run Code Online (Sandbox Code Playgroud)
结果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)
}
Run Code Online (Sandbox Code Playgroud)
斯威夫特 4.2 更新
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)
}
Run Code Online (Sandbox Code Playgroud)
警告
不要NSRange(location: 0, length: myString.count)像上面引用的所有示例一样使用。
NSRange(myString.startIndex..., in: myString)代替使用!
.count会将换行符视为\r\n一个字符 - 这可能会导致缩短的、因此无效的 NSRange 与整个字符串不匹配。
(.长度应该有效)
简单扩展:
\nextension String {\n\n func replacingRegex(\n matching pattern: String,\n findingOptions: NSRegularExpression.Options = .caseInsensitive,\n replacingOptions: NSRegularExpression.MatchingOptions = [],\n with template: String\n ) throws -> String {\n\n let regex = try NSRegularExpression(pattern: pattern, options: findingOptions)\n let range = NSRange(startIndex..., in: self)\n return regex.stringByReplacingMatches(in: self, options: replacingOptions, range: range, withTemplate: template)\n }\n }\nRun Code Online (Sandbox Code Playgroud)\nerror向调用者公开抛出range BUG| 归档时间: |
|
| 查看次数: |
33005 次 |
| 最近记录: |