swift - 用 NSRegularExpression 结果对字符串进行子串化的正确方法是什么?
问题描述
我在使用此功能时遇到问题:
private func regexFirstGroup(in intext: String, pattern: String) -> String? {
do {
let nsrange = NSRange(intext.startIndex..<intext.endIndex, in: intext)
let regex = try NSRegularExpression(pattern: pattern, options: [NSRegularExpression.Options.dotMatchesLineSeparators])
if let match = regex.firstMatch(in: intext, options: [], range: nsrange) {
guard let mrange = Range(match.range(at: 1), in:intext) else {
return nil
}
return intext.substring(with: mrange)
}
} catch {
print("Pattern \(pattern) compiled with error: \(error)")
return nil
}
return nil
}
符合:
return intext.substring(with: mrange)
给出不推荐使用的警告:'substring(with:)' is deprecated: Please use String slicing subscript。
当我将其切换到预期的 swift5 方式时:
return intext[mrange]
比它给出一个错误:下标'subscript(_:)'要求'String.Index'和'Int'类型是等价的
这很奇怪,因为下标应该与 String.Index 类型一起使用,并且在快速帮助中检查 mrange 常量显示:
Declaration
let mrange: Range<String.Index>
我没有使用 import Foundation atm。
解决方案
你应该使用下标(_:)
return String(intext[mrange])
推荐阅读
- python-3.x - 无法调用 FBO.gov 的 Web API 提供的任何方法
- database - 以最少的查询在数据库前面设计一个缓存层
- syntax - @ 选项运算符如何在 AEM HTL 模板中工作
- mysql - 从mysql中的对象数组中删除json对象
- c++ - 返回非常量引用会导致绑定引用错误
- ruby-on-rails - ActiveStorage 可以创建一个 blob 用于直接上传并在上传完成之前将其附加到模型吗?
- angular - :id 路由覆盖其他路由
- c# - 如何访问 Code-First-Database 中的表?
- c# - CosmosDb Mongo 数据库请求问题
- sql - 以前每条记录的 SQL 汇总总计