Swift中Scanner类的scanUpToString方法是否存在Bug?
问题解答:Scanner的scanUpToString并非Bug,是默认行为导致
这不是Bug,问题出在Swift的Scanner类默认会自动跳过空白字符。
原因分析
Scanner初始化时,charactersToBeSkipped属性默认包含所有空白字符(空格、换行符、制表符等)。你的代码里第一次调用scanUpToString("&")时,开头的空格被自动跳过,所以获取到的beforeString是"testing"而非预期的" testing",最终拼接出来的结果就少了开头的空格。
修复方案
只需要将Scanner的charactersToBeSkipped设为nil,关闭自动跳过空白字符的默认行为即可:
let testString = " testing & testing1&testing2" let scanner = Scanner(string: testString) scanner.charactersToBeSkipped = nil // 关键修改:关闭自动跳过空白 var resultString: String = "" while scanner.isAtEnd == false { if let beforeString = scanner.scanUpToString("&") { resultString += beforeString } guard scanner.isAtEnd == false else { break } if let scanResult = scanner.scanString("&") { resultString += "&" } }
验证结果
修改后,Scanner会保留所有原字符:
- 第一次
scanUpToString("&")会获取到" testing "(开头的空格+testing+&前的空格) - 扫描到
&后替换为& - 后续逻辑会正确处理
testing1&testing2部分,最终得到预期的" testing & testing1&testing2"
内容的提问来源于stack exchange,提问作者strawnut
相关产品推荐
相关产品推荐

