含\r\n时NSRegularExpression匹配<>标签异常问题
问题原因及解决方法
核心原因是NSRange的创建方式错误:你用NSRange(location: 0, length: s.count)指定匹配范围,但Swift的String.count统计的是Unicode字符(扩展字素簇)的数量,而NSRange的length参数需要的是UTF-16编码的代码单元数。两者在字符串包含多UTF-16单元字符(如Emoji、复合字符)时数值会不一致;即使你的字符串是ASCII字符,这种写法也可能因换行符的间接影响,导致正则只能处理字符串前半部分,进而漏匹配结果。
解决方法
改用Swift字符串索引创建正确的NSRange:
let s = "TEST \r\n\r\n<strong>more:</strong>" let re = try! NSRegularExpression(pattern: "<.*?>") // 基于字符串索引生成正确的NSRange let range = NSRange(s.startIndex..., in: s) let matches = re.matches(in: s, range: range)
执行这段代码就能得到预期的2个匹配结果。
补充说明:NSRegularExpression默认不允许.匹配\n(换行符),但会匹配\r(回车符),不过这不是本次问题的诱因,核心还是范围计算错误。
内容的提问来源于stack exchange,提问作者Peter Lapisu
相关产品推荐
相关产品推荐

