获取两个百分号之间字符串的正则表达式

5

我需要提取在两个“%”字符之间的字符串,查询字符串中可能存在多个。现在我正在使用以下正则表达式,请有人帮忙获取精确的正则表达式格式。

let query =  "Hello %test% ho do you do %test1%"
let regex = try! NSRegularExpression(pattern:"%(.*?)%", options: [])

  if let results = regex?.matchesInString(query, options: .Anchored,  range: NSMakeRange(0,query.characters.count)){
    for match in results{
         }
      }

这个能编译通过吗?querycharacters.countmatchesInString都是非可选类型,如果第一个可选绑定成功,regex就会被解包。除此之外,在这种特定的情况下,你永远不应该使用try! - vadian
2个回答

24

您的模式是正确的,但您的代码未编译。请改用以下代码:

Swift 4

let query = "Hello %test% how do you do %test1%"
let regex = try! NSRegularExpression(pattern:"%(.*?)%", options: [])
var results = [String]()

regex.enumerateMatches(in: query, options: [], range: NSMakeRange(0, query.utf16.count)) { result, flags, stop in
    if let r = result?.range(at: 1), let range = Range(r, in: query) {
        results.append(String(query[range]))
    }
}

print(results) // ["test", "test1"]

NSString使用UTF-16编码,因此NSMakeRange应该使用UTF-16代码单元的数量调用。

Swift 2

let query = "Hello %test% how do you do %test1%"
let regex = try! NSRegularExpression(pattern:"%(.*?)%", options: [])
let tmp = query as NSString
var results = [String]()

regex.enumerateMatchesInString(query, options: [], range: NSMakeRange(0, tmp.length)) { result, flags, stop in
    if let range = result?.rangeAtIndex(1) {
        results.append(tmp.substringWithRange(range))
    }
}

print(results) // ["test", "test1"]

从Swift本身的String类型中获取子字符串有些麻烦。这就是为什么我将query转换为NSString的原因。


0

我已经编写了一个正则表达式的方法。你的正则表达式很好。你可以在这里测试你的正则表达式。这个方法是:

 func regexInText(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 []
        }
    }

你可以在任何地方调用它。


为什么参数字符串是隐式解包可选项?如果您使用 regexInText(nil, text: nil) 调用函数,代码将崩溃... - vadian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接