我使用Swift extract regex matches
中的代码func matchesForRegexInText(regex: String!, text: String!) -> [String] {
do {
let regex = try NSRegularExpression(pattern: regex, options: [])
let nsString = text as NSString
let results = regex.matchesInString(text,
options: [], range: NSMakeRange(0, nsString.length))
return results.map { nsString.substringWithRange($0.range)}
} catch let error as NSError {
print("invalid regex: \(error.localizedDescription)")
return []
}
}
我尝试匹配此模式(示例模式)"^([a-z]+).*?(\d+)$"
如果我将它用于字符串" abc ..... 123" ,我会得到这个完整的字符串......
但是我希望获得字符串数组["abc", "123"]
答案 0 :(得分:1)
您必须使用第一场比赛的rangeAtIndex()
获取所捕获组的子范围 - 分别在括号内的正则表达式的表达式。
由于完整字符串的范围是索引0,因此在索引1处开始循环。
func matchesForRegexInText(regex: String, text: String) -> [String] {
var result = [String]()
do {
let regex = try NSRegularExpression(pattern: regex, options: [])
let nsString = text as NSString
if let match = regex.firstMatchInString(text, options: [], range: NSMakeRange(0, nsString.length)) {
for i in 1..<match.numberOfRanges {
result.append(nsString.substringWithRange(match.rangeAtIndex(i)))
}
}
} catch let error as NSError {
print("invalid regex: \(error.localizedDescription)")
}
return result
}
PS:并非Swift中的所有内容都需要?
或!
。参数字符串中的感叹号没有意义,因为它们实际上都不被认为是可选的。