swift - 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
但是当我删除两个回车符时,结果如预期的那样,没有破折号。这里出了什么问题?
解决方案
你的正则表达式很好。问题是它将像一个字符publicKey.count
一样计算行尾。\r\n
您可以通过使用解决问题
let range = NSMakeRange(0, publicKey.utf16.count)
或者,只需使用.replacingOccurrences
with.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?
推荐阅读
- c# - 无法使用 c++/cli 包装器从 c# dll 加载函数
- r - JAGS 和 R:获得特定 x 的后验预测分布
- .htaccess - 如何使用 htaccess 规则重写某个文件?
- c# - 使用 chilkatDotNet.dll 写入输入为 mime 内容的 .msg 文件
- .net - xBehave 将场景报告为活文档
- angular - 当返回结果为 true 时,CanActivate 不显示所需的组件
- vue.js - 如何在 vue.js 中将 codepen 作为 HTML 嵌入
- c# - 匿名实例化期间对象初始值设定项中的输出参数
- css - 引导媒体查询
- sql - Oracle 编号问题