我想从匹配正则表达式模式的字符串中提取子字符串.
所以我正在寻找这样的东西:
func matchesForRegexInText(regex: String!, text: String!) -> [String] {
???
}
Run Code Online (Sandbox Code Playgroud)
所以这就是我所拥有的:
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 ...
}
Run Code Online (Sandbox Code Playgroud)
问题是,这matchesInString提供了我的一个数组NSTextCheckingResult,其中NSTextCheckingResult.range的类型的NSRange.
NSRange是不相容的Range<String.Index>,所以它阻止我使用text.substringWithRange(...)
有没有想过如何在没有太多代码的情况下在swift中实现这个简单的事情?
我在Swift中有一个String类的扩展,它返回给定子字符串的第一个字母的索引.
任何人都可以帮助我做到这一点,它将返回所有出现的数组,而不仅仅是第一个?
谢谢.
extension String {
func indexOf(string : String) -> Int {
var index = -1
if let range = self.range(of : string) {
if !range.isEmpty {
index = distance(from : self.startIndex, to : range.lowerBound)
}
}
return index
}
}
Run Code Online (Sandbox Code Playgroud)
例如,而不是50我想要的返回值[50, 74, 91, 103]
我正在尝试从用户提供的字符串中解析出“@mentions”。正则表达式本身似乎可以找到它们,但当表情符号存在时,它提供的范围是不正确的。
let text = " @joe "
let tagExpr = try? NSRegularExpression(pattern: "@\\S+")
tagExpr?.enumerateMatches(in: text, range: NSRange(location: 0, length: text.characters.count)) { tag, flags, pointer in
guard let tag = tag?.range else { return }
if let newRange = Range(tag, in: text) {
let replaced = text.replacingCharacters(in: newRange, with: "[email]")
print(replaced)
}
}
Run Code Online (Sandbox Code Playgroud)
运行时
tag=(位置:7,长度:2)
并打印出来
[email]oe
预期结果是
[email]