我有这个小类,旨在捕获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)
}
}