regulares - ¿Cómo elimino los retornos de carro con Ruby?
ruby regex validator (14)
Pensé que este código funcionaría, pero la expresión regular nunca coincide con el / r / n. He visto los datos que estoy leyendo en un editor hexadecimal y verifico que realmente hay un patrón hexadecimal D y hexadecimal A en el archivo.
También probé las expresiones regulares / / xD / xA / m y / / x0D / x0A / m pero tampoco coinciden.
Este es mi código ahora mismo:
lines2 = lines.gsub( //r/n/m, "/n" )
if ( lines == lines2 )
print "still the same/n"
else
print "made the change/n"
end
Además de las alternativas, sería bueno saber lo que estoy haciendo mal (para facilitar algo de aprendizaje de mi parte). :)
¿Por qué no leer el archivo en modo texto, en lugar de modo binario?
¿Qué obtienes cuando haces puts lines
? Eso te dará una pista.
De forma predeterminada, File.open
abre el archivo en modo texto, por lo que sus caracteres /r/n
se convertirán automáticamente a /n
. Tal vez ese es el motivo por el que las lines
siempre son iguales a lines2
. Para evitar que Ruby analice los extremos de la línea, use el modo rb
:
C:/> copy con lala.txt a file with many lines ^Z C:/> irb irb(main):001:0> text = File.open(''lala.txt'').read => "a/nfile/nwith/nmany/nlines/n" irb(main):002:0> bin = File.open(''lala.txt'', ''rb'').read => "a/r/nfile/r/nwith/r/nmany/r/nlines/r/n" irb(main):003:0>
Pero de su pregunta y código veo que simplemente necesita abrir el archivo con el modificador predeterminado. No necesita ninguna conversión y puede usar File.read
más File.read
.
¿Qué tal lo siguiente?
irb(main):003:0> my_string = "Some text with a carriage return /r"
=> "Some text with a carriage return /r"
irb(main):004:0> my_string.gsub(//r/,"")
=> "Some text with a carriage return "
irb(main):005:0>
O...
irb(main):007:0> my_string = "Some text with a carriage return /r/n"
=> "Some text with a carriage return /r/n"
irb(main):008:0> my_string.gsub(//r/n/,"/n")
=> "Some text with a carriage return /n"
irb(main):009:0>
Creo que su expresión regular está casi completa, esto es lo que haría:
lines2 = lines.gsub(/[/r/n]+/m, "/n")
En lo anterior, puse / r y / n en una clase (de esa manera no importa en qué orden podrían aparecer) y agregué el calificador "+" (de modo que "/ r / n / r / n / r / n "también coincidiría una vez, y todo se reemplazaría por" / n ")
En general, cuando trato con stripping / r o / n, buscaré ambos haciendo algo como
lines.gsub(//r/n?/, "/n");
Descubrí que, dependiendo de cómo se guardaron los datos (el SO utilizado, el editor utilizado, la relación de Júpiter con Io en ese momento) puede haber o no una nueva línea después del retorno del carro. Parece extraño que veas ambos personajes en modo hexadecimal. Espero que esto ayude.
Puedes usar esto:
my_string.strip.gsub(//s+/, '' '')
Si está utilizando Rails, hay un método squish
"/tgoodbye/r/n".squish => "goodbye"
"/tgood /t/r/nbye/r/n".squish => "good bye"
Solo otra variante:
lines.delete(" /n")
Utilice String#strip
Devuelve una copia de str con el espacio en blanco inicial y final eliminado.
p.ej
" hello ".strip #=> "hello"
"/tgoodbye/r/n".strip #=> "goodbye"
Usando gsub
string = string.gsub(//r/," ")
string = string.gsub(//n/," ")
"still the same/n".chomp
o
"still the same/n".chomp!
http://www.ruby-doc.org/core-1.9.3/String.html#method-i-chomp
def dos2unix(input)
input.each_byte.map { |c| c.chr unless c == 13 }.join
end
remove_all_the_carriage_returns = dos2unix(some_blob)
lines.map(&:strip).join(" ")
lines2 = lines.split.join("/n")
modified_string = string.gsub(//s+/, '' '').strip