我正在使用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字符的存在?
答案 0 :(得分:0)
我想我已经通过在范围内使用它来解决它:
let r = NSMakeRange(0, count(test.utf16))
不完全确定为什么utf16是必要的,但我无法与结果争论。