我正在尝试使用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]*)
部分仍应匹配任何前导字符,但匹配不起作用。
我知道£
符号将占用两个字节,但通配符前导匹配不应该忽略它们吗?
有人能解释一下这里发生了什么吗?
\s\S
等同于.
,我会感到非常惊讶。你为什么不在第一组中使用.*
呢?话虽如此,我并不完全相信问题就出在这里;我认为更可能的是[0-9]
无法匹配Unicode数字,而不是\S
无法匹配任意非空格Unicode字符。 - Kyle Strand\d
字符类,那么为什么你要使用[0-9]
呢?如果你尝试使用(.*) (\d*)(.*)
进行匹配,你能得到一个匹配吗? - Kyle Strand