我正在使用 NSScanner 来解析“[a]”和“[/a]”之间的文本。在我的示例中,1 个输入可以包含某些文本的多个实例,因此我需要循环执行此操作。 这是我的代码:
var datastring = "test [a]1[/a][a]2[/a] [a]3[/a][a]4[/a] end"
var len = countElements(datastring)
let scanner = NSScanner(string: datastring)
var itemResult : NSString?
// loop until scanner reaches the end of string
while (scanner.scanLocation < len) {
scanner.scanUpToString("<a>", intoString: nil)
// len of "[a]" is 3
if (len - scanner.scanLocation > 3) {
scanner.scanLocation += 3
}
scanner.scanUpToString("[/a]", intoString: &itemResult)
// len of "[/a]" is 3
if (len - scanner.scanLocation > 4) {
scanner.scanLocation += 4
}
if (itemResult != nil) {
println(itemResult!)
}
}
这是输出:
1
2
]3
4
4
它有点工作,但我看到 2 个问题 1. 4 次重复 1 次 2. 它返回的不是“3”,而是“]3” 我认为这是由“[/a] [/a]”中的额外空格引起的
你能告诉我为什么 NSScanner 不能吗 1. 查找"[a]"时跳过exta空格 2. 为什么返回4两次?
谢谢。
请您参考如下方法:
@MinnesotaSteve 说到了所有要点。这是一个改进的版本。
extension NSScanner {
func scanThrough(string: String, intoString:AutoreleasingUnsafeMutablePointer<NSString?>) -> Bool {
self.scanUpToString(string, intoString: intoString)
return self.scanString(string, intoString: nil)
}
}
let datastring = "test [a]1[/a][a]2[/a] [a]3[/a][a]4[/a] end"
let scanner = NSScanner(string: datastring)
while !scanner.atEnd {
var itemResult : NSString?
if scanner.scanThrough("[a]", intoString:nil)
&& scanner.scanThrough("[/a]", intoString: &itemResult)
&& itemResult != nil {
println(itemResult!)
}
}
