¿Hay una forma aceptada de tratar con expresiones regulares en Ruby 1.9 para las cuales se desconoce la codificación de la entrada? Digamos que mi entrada pasa a ser UTF-16 codificado:Ruby 1.9: Expresiones regulares con codificación de entrada desconocida
x = "foo<p>bar</p>baz"
y = x.encode('UTF-16LE')
re = /<p>(.*)<\/p>/
x.match(re)
=> #<MatchData "<p>bar</p>" 1:"bar">
y.match(re)
Encoding::CompatibilityError: incompatible encoding regexp match (US-ASCII regexp with UTF-16LE string)
Mi enfoque actual es utilizar UTF-8 interna y volver a codificar (una copia de) la entrada si es necesario:
if y.methods.include?(:encode) # Ruby 1.8 compatibility
if y.encoding.name != 'UTF-8'
y = y.encode('UTF-8')
end
end
y.match(/<p>(.*)<\/p>/u)
=> #<MatchData "<p>bar</p>" 1:"bar">
Sin embargo, esto se siente un poco incómodo para mí, y quería preguntar si hay una mejor manera de hacerlo.
¡Gracias! No se me había ocurrido hacerlo al revés y codificar el Regexp. ¡De hecho, es mucho más rápido! Para cualquier otra persona que intente hacer esto: Tenga cuidado con las codificaciones ficticias ('#dummy?') Cuando intente probar su código. Me tomó un tiempo descubrir por qué no estaba funcionando. – DataWraith
De acuerdo sobre el rendimiento: descubrí que es exponencialmente más rápido para memorizar la expresión regular. Quick hack aquí para manejar el espacio en blanco pelado: https://gist.github.com/mahemoff/c877eb1e955b1160dcdf6f4d4c0ba043 – mahemoff