NSRegularExpression返回无效范围

时间:2015-07-19 16:22:31

标签: regex swift cocoa nsregularexpression

当我在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专家,所以我不确定如何继续。

2 个答案:

答案 0 :(得分:1)

你做这样的if测试:

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

答案 1 :(得分:0)

如果您想解析网址,最简单的方法是使用NSURL

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

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