NSRegularExpression异常,包含带有重音“é”字符的字符串

时间:2015-09-17 00:46:11

标签: regex swift nsregularexpression

我正在使用NSRegularExpression的stringByReplacingMatchesInString方法将输入字符串分成几部分,以便我可以重新排列它们。这很好用,直到我对包含重音“é”的字符串进行测试。

这是一个展示问题的XCode游乐场。在这个减少的例子中(它不是非常“真实的世界”,但它确实证明了问题),我匹配所有内容然后使用模板创建一个新的字符串,只需重复那些匹配:“$ 1 - $ 1”。

import Cocoa

var err: NSError?
var regex = NSRegularExpression(pattern: "^(.*?)$", options: nil, error: &err)

let test = "homér simpson"
let r = NSMakeRange(0, count(test))

var str = regex!.stringByReplacingMatchesInString(test, options: nil, range: r, withTemplate: "$1 - $1")

字符串“str”最终成为“homérsimpso - homérsimpson”。正如您所看到的,$ 1的第一个实例被1个字符截断,我发现这是因为带有重音的“é”。如果您编辑它以使用普通的“e”,那就没关系。

但这是奇怪的事情。如果再次编辑它以将重音“é”放回字符串中,它的行为就像它应该的那样,并且不会截断。

我倾向于怀疑范围传递给方法,但我认为count()足够智能来处理unicode字符的存在?

1 个答案:

答案 0 :(得分:0)

我想我已经通过在范围内使用它来解决它:

let r = NSMakeRange(0, count(test.utf16))

不完全确定为什么utf16是必要的,但我无法与结果争论。