Swift 2:如何抓住正则表达式组?

时间:2015-09-16 10:37:08

标签: regex url swift2

我有这个小类,旨在捕获TxStyle语法中的URL。 不幸的是,我偶然发现一个抓住捕获组的问题。我很确定这是微不足道的,但无法解决它...... 欢迎帮助: - )

class TxStyle {
    static let regexUrl = "(?:https?://)?(?:[\\da-z\\.-]+)\\.(?:[a-z\\.]{2,6})(?:[/\\w \\.-]*)*/?"
    //"(?i)https?://(?:www\\.)?\\S+(?:[\\s]*)"
    static let sRegexUrlImage = "(![^ ]*)(\(regexUrl))[^ ]*!"
    static let regexUrlImage = Regex(sRegexUrlImage)

    class func urlImage(string: String) -> String? {

        let matches = regexUrlImage.matches(string)

        var i = 0
        for match in matches {
            // range at index 0: full match
            // range at index 1: first capture group
            let substring = string[match.range]

            print("Groups \(i) is \(substring)")
            i++
        }
        if matches.count < 2 {
            return nil
        }

        let match = matches[1]
        return string[match.range]
    }   

   class func unitTest() {

       print("——— TxStyle unitTest ———")

       let text = "Vous y trouverez une belle image que voilà : !http://ZEENS.fr/images/logos/zeens.ws.logo.jpg!."
       let url = urlImage(text)
       print("— urlImage(\(text)) -> \(url)")

    }
}

在以下字符串上调用它不会给出预期的3组($ 0,$ 1和$ 2)列表。

TxStyle.unitTest()

——— TxStyle unitTest ———
Groups 0 is !http://ZEENS.fr/images/logos/zeens.ws.logo.jpg!

附录:正则表达式和字符串工具包

class Regex {
    func matches(input: String) -> [NSTextCheckingResult] {
        let matches = regex.matchesInString(input, options: [], range:NSRange(location:0, length:input.characters.count))
        return matches
    }
}

extension String {
    func range(r: NSRange) -> Range<String.Index> {
        let start = startIndex.advancedBy(r.location)
        let end = start.advancedBy(r.length)
        let range = Range<String.Index>(start: start, end: end)
        return range
    }
   subscript (r: NSRange) -> String {

        let range = self.range(r)

        return substringWithRange(range)
    }
}    

0 个答案:

没有答案