Skip to main content
 首页 » 操作系统

ios之使用 NSScanner 解析 NSString 返回元素结果的重复结尾

2024年01月01日41Leo_wl

我正在使用 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!) 
  } 
}