Swift提取正则表达式匹配

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Swift提取正则表达式匹配相关的知识,希望对你有一定的参考价值。

我想从匹配正则表达式模式的字符串中提取子字符串。

所以我正在寻找这样的东西:

func matchesForRegexInText(regex: String!, text: String!) -> [String] {
   ???
}

所以这就是我所拥有的:

func matchesForRegexInText(regex: String!, text: String!) -> [String] {

    var regex = NSRegularExpression(pattern: regex, 
        options: nil, error: nil)

    var results = regex.matchesInString(text, 
        options: nil, range: NSMakeRange(0, countElements(text))) 
            as Array<NSTextCheckingResult>

    /// ???

    return ...
}

问题是,matchesInString为我提供了一系列NSTextCheckingResult,其中NSTextCheckingResult.rangeNSRange类型。

NSRangeRange<String.Index>不相容,所以它阻止我使用text.substringWithRange(...)

有没有想过如何在没有太多代码的情况下在swift中实现这个简单的事情?

答案

即使matchesInString()方法采用String作为第一个参数,它在内部使用NSString,并且range参数必须使用NSString长度而不是Swift字符串长度。否则它将失败“扩展的字形集群”,如“标志”。

从Swift 4(Xcode 9)开始,Swift标准库提供了在Range<String.Index>NSRange之间进行转换的功能。

func matches(for regex: String, in text: String) -> [String] {

    do {
        let regex = try NSRegularExpression(pattern: regex)
        let results = regex.matches(in: text,
                                    range: NSRange(text.startIndex..., in: text))
        return results.map {
            String(text[Range($0.range, in: text)!])
        }
    } catch let error {
        print("invalid regex: (error.localizedDescription)")
        return []
    }
}

例:

let string = "

以上是关于Swift提取正则表达式匹配的主要内容,如果未能解决你的问题,请参考以下文章

Swift 提取正则表达式匹配

Swift提取正则表达式匹配

通过 Java 正则表达式提取 semver 版本字符串的片段

JAVA正则表达式怎么匹配所有符合要求的子字符串

C#正则表达式怎样提取匹配到的数据???

无法让 Swift 中的正则表达式匹配“不包含”