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.range
是NSRange
类型。
NSRange
与Range<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提取正则表达式匹配的主要内容,如果未能解决你的问题,请参考以下文章