gpt4 book ai didi

swift - 正则表达式 unicode 在 swift 中不起作用

转载 作者:可可西里 更新时间:2023-11-01 01:09:06 24 4
gpt4 key购买 nike

let regex1 = "(\\ud83d\\udc68)"
let regex2 = "(\\ud83d[\\udc68-\\udc69])"

"👨".capturedGroupsFull(forRegex: regex1)
// returns 1 match: [(.0 "👨", .1 {0, 2})]
"👨".capturedGroupsFull(forRegex: regex2)
// returns nil

为什么第一行返回一个匹配项而第二行​​没有匹配项?

  • 两个正则表达式在 regex101 上都能正常工作(例如设置为javascript 并使用第二个正则表达式作为 (\ud83d[\udc68-\udc69]))。
  • 我是使用 Swift 4.0。
  • 这个正则表达式 "(\\ud83d[\\udc68])" 也将在 Playground 中测试时返回 nil

您可以在下面找到我用来检索匹配项的完整代码。

extension String {
func capturedGroupsFull(forRegex regex: String) -> [(String, NSRange)]? {
let expression: NSRegularExpression
do {
expression = try NSRegularExpression(pattern: regex, options: [.caseInsensitive])
} catch {
return nil
}
let nsString = self as NSString
let matches = expression.matches(in: self, options: [], range: NSRange(location:0, length: nsString.length))
guard let match = matches.first else { return nil }
var results = [(String, NSRange)]()
for match in matches {
let range = match.range
let matchedString = nsString.substring(with: range)
results.append((matchedString, range))
}
return results
}
}

最佳答案

为什么第一行返回一个匹配项而第二行​​没有匹配项?

如前所述,NSRegularExpression 适用于 Unicode 代码点,而(正常的)JavaScript 正则表达式适用于 UTF-16 代码单元。

某些模式,如 "\\ud83d\\udc68",由有效的代理对组成,可能会优化为单个 Unicode 代码点 U+1F468,但此功能不好-已记录,因此您不应依赖它,正如您在示例 "(\\ud83d[\\udc68])" 中所见。


我建议不要使用 \uhhhh 的代理对,而是使用 \UHHHHHHHH(或 \x{hhhh}) BMP字符。

let regex1 = "(\\U0001F468)" //or "(\\x{1F468})"
let regex2 = "([\\U0001F468-\\U0001F469])" // or "([\\x{1F468}-\\x{1F469}])"

"👨".capturedGroupsFull(forRegex: regex1)
// -> [(.0 "👨", .1 {0, 2})]
"👨".capturedGroupsFull(forRegex: regex2)
// -> [(.0 "👨", .1 {0, 2})]

最近的 JavaScript 正则表达式接受 u 选项以使其与 Unicode 代码点一起工作,试试这些:

/(\u{1F468})/u
/([\u{1F468}-\u{1F469}])/u

您可以使用 JavaScript 语法轻松测试正则表达式模式,并将其转换为 NSRegularExpression 语法,将 \u 替换为 \x(并删除//u).

关于swift - 正则表达式 unicode 在 swift 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49561982/

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