NSRegularExpression Returns 无效范围

NSRegularExpression Returns Invalid Range

当我在 Playground 中 运行 以下代码时,我得到了一个无效的范围:

import Cocoa

var error: NSError?
var captureGroups: [String] = []
var input = "http://www.google.com"

var pattern = "(https?|ftp|file|gopher|mailto|news|nntp|telnet|wais)://[a-zA-Z0-9_@]+([.:][a-zA-Z0-9_@]+)*/?[a-zA-Z0-9_?,%#~&/\-]+([:.][a-zA-Z0-9_?,%#~&/\-]+)*"

var internalExpression = NSRegularExpression(pattern: pattern, options: .CaseInsensitive, error: &error)!

if let match = internalExpression.firstMatchInString(input, options: nil, range: NSMakeRange(0, count(input))) {

    match.numberOfRanges // 4
    match.rangeAtIndex(0) // (0, 21)
    match.rangeAtIndex(1) // (0, 4)
    match.rangeAtIndex(2) // (17, 3)
    match.rangeAtIndex(3) // (9223372036854775807,0)
}

此代码对其他正则表达式有效,似乎只有这个给它带来麻烦。我不是 RegEx 专家,所以我不确定应该如何进行。

你像这样做一个 if 测试:

if match.rangeAtIndex(3).location != NSNotFound {
    // Do if found result.
} else {
    // Handle error.
}

如果你想解析一个URL,使用NSURL可能是最简单的:

if let url = NSURL(string: input) {
    println(url.scheme)
    println(url.host)
    println(url.path)
    println(url.pathComponents)
    println(url.query)
}

如果您需要帮助修复正则表达式并理解您收到 NSNotFound 的原因,您应该清楚地描述您希望从中解析出的内容。但是在处理URL的时候,NSURL是最简单的。