首页 > 解决方案 > 在 Swift 正则表达式中使用 Unicode

问题描述

我正在尝试在 Swift 中匹配字符串中的正则表达式模式。当我在正则表达式模式中使用实际字符时,它按预期工作。但是,我在正则表达式中使用相同字符的 Unicode 版本,它不能按预期工作。你能帮我解决这里有什么问题吗?我需要使用带有 Unicode 的正则表达式。

代码:

var input = "一" // u{4E00}

extension String {
    var patternMatchesWithUnicode: Bool {
        //doesnt work
        return self.range(of: #"[\u{4E00}-\u{9FFF}]"#, options: .regularExpression) != nil
    }
    var patternMatchesWithString: Bool {
        //works
        return self.range(of: #"[一-鿿]"#, options: .regularExpression) != nil
    }
}

print(input.patternMatchesWithString)
print(input.patternMatchesWithUnicode)

输出:

false
true

标签: swiftregexunicode

解决方案


您可以使用

extension String {
    var patternMatchesWithUnicode: Bool {
        return self.range(of: #"[\u4E00-\u9FFF]"#, options: .regularExpression) != nil
    }
}

这些也将起作用:

return self.range(of: #"[\x{4E00}-\x{9FFF}]"#, options: .regularExpression) != nil
return self.range(of: #"[\U00004E00-\U00009FFF]"#, options: .regularExpression) != nil

Swift 正则表达式风格是ICU,请参阅文档页面的摘录:

\uhhhh - 将字符与十六进制值匹配hhhh
\Uhhhhhhhh- 将字符与十六进制值匹配hhhhhhhh。必须提供八位十六进制数字,即使最大的 Unicode 代码点是\U0010ffff.
\x{hhhh}- 将字符与十六进制值匹配hhhh。可以提供一到六个十六进制数字。
\xhh- 将字符与两位十六进制值匹配hh


推荐阅读