Как я могу использовать NSRegularExpression для строк Swift с символами Unicode переменной ширины?
У меня проблемы с получениемNSRegularExpression
сопоставлять шаблоны в строках с более широкими (?) символами Unicode в них. Похоже, что проблема заключается в параметре диапазона - Swift подсчитывает отдельные символы Unicode, в то время как Objective-C обрабатывает строки так, как если бы они состояли из единиц кода UTF-16.
Вот моя тестовая строка и два регулярных выражения:
let str = "dogcow"
let dogRegex = NSRegularExpression(pattern: "d.g", options: nil, error: nil)!
let cowRegex = NSRegularExpression(pattern: "c.w", options: nil, error: nil)!
Я могу сопоставить первое регулярное выражение без проблем:
let dogMatch = dogRegex.firstMatchInString(str, options: nil,
range: NSRange(location: 0, length: countElements(str)))
println(dogMatch?.range) // (0, 3)
Но второй сбой с теми же параметрами, потому что диапазон, который я посылаю (0 ... 7), недостаточно длинный, чтобы охватить всю строку доNSRegularExpression
обеспокоен:
let cowMatch = cowRegex.firstMatchInString(str, options: nil,
range: NSRange(location: 0, length: countElements(str)))
println(cowMatch.range) // nil
Если я использую другой диапазон, я могу добиться успеха:
let cowMatch2 = cowRegex.firstMatchInString(str, options: nil,
range: NSRange(location: 0, length: str.utf16Count))
println(cowMatch2?.range) // (7, 3)
но тогда я не знаю, как извлечь сопоставленный текст из строки, так как этот диапазон находится вне диапазона строки Swift.