Swift替换子串正则表达式

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)

  • DarkDust 提到的选项是“AnchorsMatchLines” (2认同)

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(从而从电话号码中删除国家/地区代码)


Dan*_*l J 9

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)


bla*_*arl 9

斯威夫特 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)


coy*_*yer 7

警告

不要NSRange(location: 0, length: myString.count)像上面引用的所有示例一样使用。

NSRange(myString.startIndex..., in: myString)代替使用!

.count会将换行符视为\r\n一个字符 - 这可能会导致缩短的、因此无效的 NSRange 与整个字符串不匹配。

(.长度应该有效)


Moj*_*ini 6

简单扩展:

\n
extension 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 }\n
Run Code Online (Sandbox Code Playgroud)\n

\xe2\x9c\x85 相对于其他答案的优势

\n
    \n
  • error向调用者公开抛出
  • \n
  • 默认向调用者公开查找选项,以便于使用
  • \n
  • 向调用者公开默认的替换选项,以便于使用
  • \n
  • 修复了原答案中的range BUG
  • \n
\n