2012-02-11 12 views

risposta

21

lstrip sembra essere ciò che si vuole (assumendo trailing spazio bianco dovrebbero essere tenuti):

>> s = "\naaaa\nbbbb" #=> "\naaaa\nbbbb" 
>> s.lstrip #=> "aaaa\nbbbb" 

Dalla documentazione:

restituisce una copia di str con iniziali rimossi gli spazi bianchi. Vedi anche String # rstrip e String # strip.

http://ruby-doc.org/core-1.9.3/String.html#method-i-lstrip

+0

vergogna su di me :) ! – fl00r

1

Questo dovrebbe funzionare per voi: s.strip.

11

strip rimuoverà tutti gli spazi finali

s = "\naaaa\nbbbb" 
s.strip! 

piccolo hack per chomp spazi leader:

str = "\nmy string" 
chomped_str = str.reverse.chomp.reverse 
+1

Giusto per chiarire, 'String # strip' e' String # strip! 'Rimuovono entrambi gli spazi bianchi * leading * e * trailing *. Ecco perché funziona in questo caso. – tadman

+0

yeap 'strip rimuoverà tutti gli spazi bianchi finali :) Ma non so se è necessario rimuovere SOLO spazi bianchi iniziali o tutti. Ad ogni modo non c'è nessun 'chomp' per gli spazi iniziali – fl00r

+5

@ fl00r Ma c'è 'lstrip' solo per rimuovere lo spazio bianco principale :-) Ho postato una risposta. –

2

Non so se è il modo migliore, ma si potrebbe provare:

s.reverse.chomp.reverse 

se vuoi lasciare la newline finale (se esiste).

+0

Nota: se si passa un argomento a 'chomp', si vorrà invertire anche questo:' s.reverse.chomp (x.reverse) .reverse' – 0xtobit

6
s.sub(/^[\n\r]*/, '') 

Questo rimuove nuove righe iniziali (ritorni a capo e avanzamenti di riga, come in chomp), non qualsiasi spazio bianco.

+0

'\ A' per" inizio stringa "potrebbe essere più corretto di'^'per" inizio riga ". Ma l'espressione sopra dovrebbe funzionare come richiesto poiché 'sub' insieme con l'asterisco assicura che corrisponda solo alla prima riga. –

7

Quindi, solo per un po 'di chiarimenti, ci sono tre modi per procedere: sub, reverse.chomp.reverse e lstrip.

Mi raccomando a sub perché è un po 'meno leggibile, ma anche per il suo funzionamento: creando una nuova stringa che eredita dalla vecchia stringa. Inoltre hai bisogno di un'espressione regolare per qualcosa che sia abbastanza semplice.

Quindi sei a reverse.chomp.reverse e lstrip. Molto probabilmente, si desidera lstrip perché è un po 'più veloce, ma si tenga presente che le operazioni strip sono non le stesse operazioni di chomp. strip rimuoverà tutti leader a capo e spazi bianchi:

"\n aaa\nbbb".reverse.chomp.reverse # => " aaa\nbbb" 
"\n aaa\nbbb".lstrip     # => "aaa\nbbb" 

Se si vuole fare in modo di rimuovere un solo personaggio e che è sicuramente una nuova riga, utilizzare la soluzione reverse.chomp.reverse. Se consideri tutte le nuove linee guida e la spazzatura di spazi bianchi, vai con lstrip.

L'unico caso a cui posso pensare per l'utilizzo di espressioni regolari sarebbe se si dispone di un numero sconosciuto di \r se \n s all'inizio e si desidera tagliare tutti ma evitare di toccare qualsiasi spazio bianco. Potresti usare un loop e più metodi String per il trimming, ma sarebbe solo più brutto. Le implicazioni sulla performance non contano molto.

+0

Direi che se vuole solo rimuovere un carattere che è una nuova riga, la sua soluzione corrente con 'sub!' (La versione sul posto) è molto meglio di 'reverse.chomp.reverse'. –

0

Un modo per fare questo per gli spazi bianchi o caratteri non spazi bianchi è come questo:

s = "\naaaa\nbbbb" 
s.slice!("\n") # returns "\n" but s also has the first newline removed. 
puts s # shows s has the first newline removed 
Problemi correlati