首页 > 解决方案 > Swift 正则表达式 - 回车的意外行为`\r`

问题描述

我在 Swift 中有一个公共/私有 RSA 密钥字符串,我想使用正则表达式从中删除注释。实际的键字符串包含特殊字符组合,例如\r\n回车 + 换行。这是一个例子:

let publicKey = "-----BEGIN RSA PUBLIC KEY-----\n0123456789\r\n0123456789\r\nabcdefgh\n-----END RSA PUBLIC KEY-----"
let regex = try! NSRegularExpression(pattern: "(\n)?-* ?(BEGIN|END) ((PRIVATE RSA|PUBLIC RSA)|(RSA PRIVATE|RSA PUBLIC)|(PRIVATE|PUBLIC)) KEY ?-*(\n)?", options: NSRegularExpression.Options.caseInsensitive)
let range = NSMakeRange(0, publicKey.count)
print(regex.stringByReplacingMatches(in: publicKey, options: [], range: range, withTemplate: ""))

打印的结果是

0123456789
0123456789
abcdefgh--

但应该是

0123456789
0123456789
abcdefgh

但是当我删除两个回车符时,结果如预期的那样,没有破折号。这里出了什么问题?

标签: swiftregexcarriage-returnnsregularexpression

解决方案


你的正则表达式很好。问题是它将像一个字符publicKey.count一样计算行尾。\r\n

您可以通过使用解决问题

let range = NSMakeRange(0, publicKey.utf16.count)

或者,只需使用.replacingOccurrenceswith.regularExpression选项:

let publicKey = "-----BEGIN RSA PUBLIC KEY-----\n0123456789\r\n0123456789\r\nabcdefgh\n-----END RSA PUBLIC KEY-----"
let regex = "(?i)(\n)?-* ?(BEGIN|END) ((PRIVATE RSA|PUBLIC RSA)|(RSA PRIVATE|RSA PUBLIC)|(PRIVATE|PUBLIC)) KEY ?-*(\n)?"
print( publicKey.replacingOccurrences(of: regex, with: "", options: [.regularExpression]) )
// => 0123456789
//    0123456789
//    abcdefgh

以防万一你想缩短模式,使用

(?i)\n?-* ?(?:BEGIN|END) (?:(?:PRIVATE|PUBLIC)(?: RSA)?|RSA (?:PRIVATE|PUBLIC)) KEY ?-*\n?

查看正则表达式在线演示


推荐阅读