Como posso usar o NSRegularExpression em seqüências de caracteres Swift com caracteres Unicode de largura variável?
Estou tendo problemas para conseguirNSRegularExpression
para combinar padrões em cadeias com caracteres Unicode mais largos (?). Parece que o problema é o parâmetro range - o Swift conta caracteres Unicode individuais, enquanto o Objective-C trata as strings como se fossem compostas de unidades de código UTF-16.
Aqui está minha string de teste e duas expressões regulares:
let str = "dogcow"
let dogRegex = NSRegularExpression(pattern: "d.g", options: nil, error: nil)!
let cowRegex = NSRegularExpression(pattern: "c.w", options: nil, error: nil)!
Posso combinar o primeiro regex sem problemas:
let dogMatch = dogRegex.firstMatchInString(str, options: nil,
range: NSRange(location: 0, length: countElements(str)))
println(dogMatch?.range) // (0, 3)
Mas o segundo falha com os mesmos parâmetros, porque o intervalo que eu envio (0 ... 7) não é longo o suficiente para cobrir toda a cadeia, tanto quantoNSRegularExpression
está preocupado:
let cowMatch = cowRegex.firstMatchInString(str, options: nil,
range: NSRange(location: 0, length: countElements(str)))
println(cowMatch.range) // nil
Se eu usar um intervalo diferente, posso fazer a partida ser bem-sucedida:
let cowMatch2 = cowRegex.firstMatchInString(str, options: nil,
range: NSRange(location: 0, length: str.utf16Count))
println(cowMatch2?.range) // (7, 3)
mas não sei como extrair o texto correspondente da sequência, pois esse intervalo fica fora do intervalo da sequência Swift.