gpt4 book ai didi

regex - 当源包含 unicode 字符时,Swift Regex 匹配失败

转载 作者:搜寻专家 更新时间:2023-10-31 08:18:53 25 4
gpt4 key购买 nike

我正在尝试使用 NSRegularExpression 进行简单的正则表达式匹配,但是当源包含多字节字符时,我在匹配字符串时遇到了一些问题:

let string = "D 9"

// The following matches (any characters)(SPACE)(numbers)(any characters)
let pattern = "([\\s\\S]*) ([0-9]*)(.*)"

let slen : Int = string.lengthOfBytesUsingEncoding(NSUTF8StringEncoding)

var error: NSError? = nil

var regex = NSRegularExpression(pattern: pattern, options: NSRegularExpressionOptions.DotMatchesLineSeparators, error: &error)

var result = regex?.stringByReplacingMatchesInString(string, options: nil, range: NSRange(location:0,
length:slen), withTemplate: "First \"$1\" Second: \"$2\"")

上面的代码按预期返回“D”和“9”

如果我现在更改第一行以包含英国“英镑”货币符号,如下所示:

let string = "£ 9"

然后匹配不起作用,即使表达式的 ([\\s\\S]*) 部分仍应匹配 任何 前导字符。

我知道 £ 符号需要两个字节,但是通配符前导匹配应该忽略那些不应该吗?

谁能解释一下这里发生了什么?

最佳答案

这可能会令人困惑。 stringByReplacingMatchesInString()的第一个参数映射自NSString中Objective-C 到 Swift 中的 String,但是 range: 参数仍然是一个 NSRange。因此,您必须以单位指定范围NSString 使用(UTF-16 代码点数):

var result = regex?.stringByReplacingMatchesInString(string,
options: nil,
range: NSRange(location:0, length:(string as NSString).length),
withTemplate: "First \"$1\" Second: \"$2\"")

或者你可以使用 count(string.utf16)而不是 (string as NSString).length

完整示例:

let string = "£ 9"

let pattern = "([\\s\\S]*) ([0-9]*)(.*)"
var error: NSError? = nil
let regex = NSRegularExpression(pattern: pattern,
options: NSRegularExpressionOptions.DotMatchesLineSeparators,
error: &error)!

let result = regex.stringByReplacingMatchesInString(string,
options: nil,
range: NSRange(location:0, length:(string as NSString).length),
withTemplate: "First \"$1\" Second: \"$2\"")
println(result)
// First "£" Second: "9"

关于regex - 当源包含 unicode 字符时,Swift Regex 匹配失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29756530/

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