RegExp在Swift中匹配

时间:2016-01-12 21:11:55

标签: swift

我使用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"]

1 个答案:

答案 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中的所有内容都需要?!。参数字符串中的感叹号没有意义,因为它们实际上都不被认为是可选的。