gpt4 book ai didi

objective-c - 如何在具有可变宽度 Unicode 字符的 Swift 字符串上使用 NSRegularExpression?

转载 作者:IT王子 更新时间:2023-10-29 05:42:45 24 4
gpt4 key购买 nike

我无法让 NSRegularExpression 匹配字符串中具有更宽 (?) Unicode 字符的模式。看起来问题出在范围参数上——Swift 对单个 Unicode 字符进行计数,而 Objective-C 将字符串视为由 UTF-16 代码单元组成。

这是我的测试字符串和两个正则表达式:

let str = "dog🐶🐮cow"
let dogRegex = NSRegularExpression(pattern: "d.g", options: nil, error: nil)!
let cowRegex = NSRegularExpression(pattern: "c.w", options: nil, error: nil)!

我可以毫无问题地匹配第一个正则表达式:

let dogMatch = dogRegex.firstMatchInString(str, options: nil, 
range: NSRange(location: 0, length: countElements(str)))
println(dogMatch?.range) // (0, 3)

但是第二个参数相同但失败了,因为就 NSRegularExpression 而言,我发送的范围 (0...7) 不足以覆盖整个字符串:

let cowMatch = cowRegex.firstMatchInString(str, options: nil, 
range: NSRange(location: 0, length: countElements(str)))
println(cowMatch.range) // nil

如果我使用不同的范围,我可以使匹配成功:

let cowMatch2 = cowRegex.firstMatchInString(str, options: nil, 
range: NSRange(location: 0, length: str.utf16Count))
println(cowMatch2?.range) // (7, 3)

但是我不知道如何从字符串中提取匹配的文本,因为该范围超出了 Swift 字符串的范围。

最佳答案

事实证明,您可以以毒攻毒。使用 Swift 原生字符串的 utf16Count 属性和 NSStringsubstringWithRange: 方法 -- not String -- 得到正确的结果。这是完整的工作代码:

let str = "dog🐶🐮cow"
let cowRegex = NSRegularExpression(pattern: "c.w", options: nil, error: nil)!

if let cowMatch = cowRegex.firstMatchInString(str, options: nil,
range: NSRange(location: 0, length: str.utf16Count)) {
println((str as NSString).substringWithRange(cowMatch.range))
// prints "cow"
}

(我在写问题的过程中想到了这一点;rubber duck debugging 得一分。)

关于objective-c - 如何在具有可变宽度 Unicode 字符的 Swift 字符串上使用 NSRegularExpression?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25882503/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com