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专家,所以我不确定我应该如何继续。
答
如果你做了这样的试验:
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
是最简单的。
这里的工作https://regex101.com/r/nK7oK0/2 –
9223372036854775807是NSIntegerMax aka NSNotFound,即没有匹配的最后一个捕获组。你期望什么结果? –
@MartinR我本来期望这场比赛失败,但我不是RegEx专家。有没有一种首选的方法来测试这种情况?我对可可也比较陌生。 – user3338852