Come rimuovere tutte le interruzioni di riga da una stringa


441

Ho un testo in una textarea e l'ho letto usando l'attributo .value.

Ora vorrei rimuovere tutte le interruzioni di riga (il carattere che viene prodotto quando si preme Enter) dal mio testo ora utilizzando .replace con un'espressione regolare, ma come posso indicare un'interruzione di riga in una regex?

Se ciò non è possibile, esiste un altro modo?


Risposte:


502

Questa è probabilmente una FAQ. Ad ogni modo, le interruzioni di riga (meglio: newline) possono essere tra Carriage Return (CR ,, \rsu Mac più vecchi), Line Feed (LF ,, su Unices \nincluso Linux) o CR seguito da LF ( \r\n, su WinDOS). (Contrariamente a un'altra risposta, questo non ha nulla a che fare con la codifica dei caratteri.)

Pertanto, il RegExpletterale più efficiente per abbinare tutte le varianti è

/\r?\n|\r/

Se desideri abbinare tutte le newline in una stringa, utilizza una corrispondenza globale,

/\r?\n|\r/g

rispettivamente. Quindi procedere con il replacemetodo come suggerito in diverse altre risposte. (Probabilmente non vuoi rimuovere le nuove righe, ma sostituirle con altri spazi bianchi, ad esempio il carattere spazio, in modo che le parole rimangano intatte.)


16
Per completezza, va notato che ci sono quattro diversi caratteri di nuova riga in Unicode: \u000ao \n, che è un avanzamento di riga; \u000do \r, che è un ritorno a capo; \u2028, un separatore di linea; e \u2029un separatore di paragrafo. In pratica, tuttavia, la regex che hai pubblicato è sufficiente nella maggior parte dei casi.
Mathias Bynens,

4
@MathiasBynens Grazie, ma U + 2028 e U + 2029 non costituiscono esplicitamente interruzioni di riga in HTML (4.01), su cui l'albero DOM e il valore live di textarea sono basati su: w3.org/TR/html4/struct/text.html #whitespace
Pointed Ears

5
@PointedEars Sì, ma la serializzazione HTML non si verifica quando si imposta .valuedinamicamente l'area di testo, ad es textarea.value = 'a\u2029b'; textarea.value.charAt(1) == '\u2029'; // true. Ma questo è probabilmente un caso limite - come ho detto, nella maggior parte dei casi la tua regex è sufficiente.
Mathias Bynens,

2
@MathiasBynens Poiché U + 2028 e U + 2029 non costituiscono interruzioni di riga in HTML (4.01), tale assegnazione non visualizza due righe nell'area di testo con un'implementazione DOM e un motore di layout principali. Quindi, nessuno nella loro mente giusta in primo luogo farebbe un tale incarico.
Pointed Ears

1
Ho dovuto sfuggire alla barra rovesciata per farlo funzionare per me, ad esempio textIn.replace (/ (\\ r \\ n | \\ n | \\ r) / gm, ""). +1 ancora. Grazie
Crab Bucket,

513

La modalità di interruzione di riga varia tra le codifiche del sistema operativo. Lo sarebbe Windows \r\n, ma Linux lo usa \ne Apple lo usa \r.

Ho trovato questo nelle interruzioni di riga JavaScript :

someText = someText.replace(/(\r\n|\n|\r)/gm, "");

Ciò dovrebbe rimuovere tutti i tipi di interruzioni di riga.


19
Perché avere il separato \r\n e \n e \r meglio del semplice /[\n\r]/g? Sicuramente questo è più lento di quanto dovrebbe essere, in quanto deve solo controllare ciascun personaggio rispetto all'insieme di due possibili opzioni.
Codice finito l'

2
Quando ho analizzato i dati restituiti da memcached in node.js usando / [\ n \ r] / g ha fatto il trucco per me. Grazie Gone Coding! L'opzione nella risposta l'ha macellata.
Kyle Coots,

111

var str = " \n this is a string \n \n \n"

console.log(str);
console.log(str.trim());

String.trim() rimuove gli spazi bianchi dall'inizio e dalla fine delle stringhe ... comprese le nuove righe.

const myString = "   \n \n\n Hey! \n I'm a string!!!         \n\n";
const trimmedString = myString.trim();

console.log(trimmedString);
// outputs: "Hey! \n I'm a string!!!"

Ecco un violino di esempio: http://jsfiddle.net/BLs8u/

NOTA! taglia solo l'inizio e la fine della stringa, non le interruzioni di riga o gli spazi bianchi nel mezzo della stringa.


34
Ciò rimuove solo le interruzioni di riga dall'inizio e dalla fine della stringa. OP ha chiesto come rimuovere TUTTE le interruzioni di riga.
Ian Walter,

4
Sì, solo aggiungendo come opzione.
RobW

1
Ha funzionato per quello che mi serviva: inizio e fine della stringa. Grazie!
Harlin,

47

È possibile utilizzare \nin una regex per le newline e \rper i resi di trasporto.

var str2 = str.replace(/\n|\r/g, "");

Diversi sistemi operativi utilizzano differenti terminazioni di linea, con diverse miscele di \ne \r. Questa regex li sostituirà tutti.


Penso che questo sostituirà solo la prima occorrenza
Sebas

5
/\n|\r/gè scritto in modo più efficiente /[\n\r]/go uniforme /[\n\r]+/g. Evita l'alternanza a meno che tu non ne abbia assolutamente bisogno.
Pointed Ears

Non sono sicuro che si tratti di un reclamo. Fa quello che ho detto: rimuovi TUTTO non in quell'intervallo HEX. Quali caratteri dipendono ovviamente dal set di caratteri, ma questo post parlava di ASCII.
masi,

22

Se vuoi rimuovere tutti i caratteri di controllo, inclusi CR e LF, puoi usare questo:

myString.replace(/[^\x20-\x7E]/gmi, "")

Rimuoverà tutti i caratteri non stampabili. Questi sono tutti caratteri NON compresi nello spazio ASCII HEX 0x20-0x7E. Sentiti libero di modificare la gamma HEX secondo necessità.


2
Ciò eliminerà anche alcuni caratteri nazionali da lingue diverse dall'inglese ....
Smentek,

21

La soluzione più semplice sarebbe:

let str = '\t\n\r this  \n \t   \r  is \r a   \n test \t  \r \n';
str.replace(/\s+/g, ' ').trim();
console.log(str); // logs: "this is a test"

.replace()con /\s+/gregexp sta cambiando tutti i gruppi di caratteri degli spazi bianchi in un unico spazio nell'intera stringa, quindi .trim()il risultato è rimuovere tutti gli spazi bianchi eccedenti prima e dopo il testo.

Sono considerati caratteri di spazi bianchi:
[ \f\n\r\t\v​\u00a0\u1680​\u2000​-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]


Fantastico, ma riesco a riassegnare la variabile:str = str.replace(/\s+/g, ' ').trim();
Fred K, il


15

Per rimuovere i nuovi caratteri di linea usa questo:

yourString.replace(/\r?\n?/g, '')

Quindi puoi tagliare la stringa per rimuovere gli spazi iniziali e finali:

yourString.trim()

6

La risposta fornita da PointedEars è tutto ciò di cui la maggior parte di noi ha bisogno. Ma seguendo la risposta di Mathias Bynens, ho fatto un viaggio su Wikipedia e ho trovato questo: https://en.wikipedia.org/wiki/Newline .

Quella che segue è una funzione drop-in che implementa tutto ciò che la pagina Wiki sopra considera "nuova linea" al momento di questa risposta.

Se qualcosa non si adatta alla tua custodia, rimuovila. Inoltre, se stai cercando prestazioni questo potrebbe non essere, ma per uno strumento rapido che fa il lavoro in ogni caso, questo dovrebbe essere utile.

// replaces all "new line" characters contained in `someString` with the given `replacementString`
const replaceNewLineChars = ((someString, replacementString = ``) => { // defaults to just removing
  const LF = `\u{000a}`; // Line Feed (\n)
  const VT = `\u{000b}`; // Vertical Tab
  const FF = `\u{000c}`; // Form Feed
  const CR = `\u{000d}`; // Carriage Return (\r)
  const CRLF = `${CR}${LF}`; // (\r\n)
  const NEL = `\u{0085}`; // Next Line
  const LS = `\u{2028}`; // Line Separator
  const PS = `\u{2029}`; // Paragraph Separator
  const lineTerminators = [LF, VT, FF, CR, CRLF, NEL, LS, PS]; // all Unicode `lineTerminators`
  let finalString = someString.normalize(`NFD`); // better safe than sorry? Or is it?
  for (let lineTerminator of lineTerminators) {
    if (finalString.includes(lineTerminator)) { // check if the string contains the current `lineTerminator`
      let regex = new RegExp(lineTerminator.normalize(`NFD`), `gu`); // create the `regex` for the current `lineTerminator`
      finalString = finalString.replace(regex, replacementString); // perform the replacement
    };
  };
  return finalString.normalize(`NFC`); // return the `finalString` (without any Unicode `lineTerminators`)
});

3
Primo: per le persone che trovano questo non usando JS - il supporto "più" ai sapori di RE \Rche è "tutti" gli avanzamenti di linea. In secondo luogo - perché non semplicementesomeString.replace(new RegExp(lineTerminators.join('|')), '');
SamWhan l'

@ClasG, hai ragione. Penso che il mio pensiero quando ho scritto questo doveva funzionare solo replace()per quello lineTerminatorsche esisteva nella stringa per motivi di prestazioni.
futz.co,

5

Una interruzione di riga in regex è \ n, quindi lo sarebbe il tuo script

var test = 'this\nis\na\ntest\nwith\newlines';
console.log(test.replace(/\n/g, ' '));

5

Sto aggiungendo la mia risposta, è solo un addon a quanto sopra, poiché per me ho provato tutte le opzioni / n e non ha funzionato, ho visto che il mio testo proviene dal server con doppia barra quindi ho usato questo:

var fixedText = yourString.replace(/(\r\n|\n|\r|\\n)/gm, '');

5

UTILIZZA QUESTA FUNZIONE QUI SOTTO E RENDI FACILE LA TUA VITA

L'approccio più semplice consiste nell'utilizzare espressioni regolari per rilevare e sostituire le nuove righe nella stringa. In questo caso, utilizziamo la funzione di sostituzione insieme a stringa per sostituire, che nel nostro caso è una stringa vuota.

function remove_linebreaks( var message ) {
    return message.replace( /[\r\n]+/gm, "" );
}

Nell'espressione precedente, g e m sono per flag globali e multilinea


2

Prova il seguente codice. Funziona su tutte le piattaforme.

var break_for_winDOS = 'test\r\nwith\r\nline\r\nbreaks';
var break_for_linux = 'test\nwith\nline\nbreaks';
var break_for_older_mac = 'test\rwith\rline\rbreaks';

break_for_winDOS.replace(/(\r?\n|\r)/gm, ' ');
//output
'test with line breaks'

break_for_linux.replace(/(\r?\n|\r)/gm, ' ');
//output
'test with line breaks'

break_for_older_mac.replace(/(\r?\n|\r)/gm, ' ');
// Output
'test with line breaks'

0

Su Mac, basta usare \nin regexp per abbinare le interruzioni di riga. Quindi il codice sarà string.replace(/\n/g, ''), ps: la g seguita significa match all invece che solo il primo.

Su Windows, lo sarà \r\n.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.