首页 > 解决方案 > 用 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。

标签: swift

解决方案


你应该使用下标(_:)

return String(intext[mrange])

推荐阅读