在Swift中等效的preg_match

时间:2015-05-06 12:45:17

标签: php regex swift

我试图将PHP函数转换为Swift。该函数用于根据我的正则表达式将String格式化为另一个。这就是我在PHP中所做的:

    preg_match('/P(([0-9]+)Y)?(([0-9]+)M)?(([0-9]+)D)?T?(([0-9]+)H)?(([0-9]+)M)?(([0-9]+)(\.[0-9]+)?S)?/', $duration, $matches)

我使用$ matches数组来格式化我的新String。 所以,在Swift中,我找到了这个帖子:Swift extract regex matches,它似乎做了我想要的。但是当我得到结果时,我的数组只有一个字符串长,我的整个输入......

    func matchesForRegexInText(regex: String!, text: String!) -> [String] {

       let regex = NSRegularExpression(pattern: regex,
           options: nil, error: nil)!
       let nsString = text as NSString
       let results = regex.matchesInString(text,
       options: nil, range: NSMakeRange(0, nsString.length)) as    [NSTextCheckingResult]
       return map(results) { nsString.substringWithRange($0.range)}
    }

    let matches = matchesForRegexInText("P(([0-9]+)Y)?(([0-9]+)M)?(([0-9]+)D)?T?(([0-9]+)H)?(([0-9]+)M)?(([0-9]+)(.[0-9]+)?S)?", text: "PT00042H42M42S")
    println(matches)
    // [PT00042H42M42S]

你知道什么是错的吗?

感谢您的回答!

1 个答案:

答案 0 :(得分:1)

数组包含一个元素,因为输入只包含一个字符串" PT00042H42M42S"与模式匹配。

如果您想要检索匹配的捕获组,那么您必须这样做 在rangeAtIndex:上使用NSTextCheckingResult。例如:

let pattern = "P(([0-9]+)Y)?(([0-9]+)M)?(([0-9]+)D)?T?(([0-9]+)H)?(([0-9]+)M)?(([0-9]+)(.[0-9]+)?S)?"
let regex = NSRegularExpression(pattern: pattern, options: nil, error: nil)!
let text = "PT00042H42M42S"
let nsString = text as NSString
if let result = regex.firstMatchInString(text, options: nil, range: NSMakeRange(0, nsString.length)) {
    for i in 0 ..< result.numberOfRanges {
        let range = result.rangeAtIndex(i)
        if range.location != NSNotFound {
            let substring = nsString.substringWithRange(result.rangeAtIndex(i))
            println("\(i): \(substring)")
        }
    }
}

结果:

0: PT00042H42M42S
7: 00042H
8: 00042
9: 42M
10: 42
11: 42S
12: 42