NSRegularExpression返回无效范围

问题描述:

当我运行在操场下面的代码,我得到一个无效的范围,结果:NSRegularExpression返回无效范围

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)://[[email protected]]+([.:][[email protected]]+)*/?[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专家,所以我不确定我应该如何继续。

+0

这里的工作https://regex101.com/r/nK7oK0/2 –

+1

9223372036854775807是NSIntegerMax aka NSNotFound,即没有匹配的最后一个捕获组。你期望什么结果? –

+0

@MartinR我本来期望这场比赛失败,但我不是RegEx专家。有没有一种首选的方法来测试这种情况?我对可可也比较陌生。 – user3338852

如果你做了这样的试验:

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是最简单的。