Cara menghapus semua jeda baris dari sebuah string

441

Saya memiliki teks di textarea dan saya membacanya menggunakan atribut .value.

Sekarang saya ingin menghapus semua linebreak (karakter yang dihasilkan saat Anda menekan Enter) dari teks saya sekarang menggunakan .replace dengan ekspresi reguler, tetapi bagaimana cara menunjukkan linebreak dalam regex?

Jika itu tidak mungkin, apakah ada cara lain?

Wingblade
sumber

Jawaban:

502

Ini mungkin sebuah FAQ. Bagaimanapun, jeda baris (lebih baik: baris baru) dapat menjadi salah satu dari Carriage Return (CR, \rpada Mac yang lebih lama), Line Feed (LF \n,, pada Unices termasuk Linux) atau CR diikuti oleh LF ( \r\n, pada WinDOS). (Bertentangan dengan jawaban lain, ini tidak ada hubungannya dengan pengkodean karakter.)

Oleh karena itu, RegExpliteral paling efisien untuk mencocokkan semua varian adalah

/\r?\n|\r/

Jika Anda ingin mencocokkan semua baris baru dalam sebuah string, gunakan pencocokan global,

/\r?\n|\r/g

masing-masing. Kemudian lanjutkan dengan replacemetode seperti yang disarankan dalam beberapa jawaban lain. (Mungkin Anda tidak ingin menghapus baris baru, tetapi menggantinya dengan spasi putih lainnya, misalnya karakter spasi, sehingga kata-kata tetap utuh.)

PointedEars
sumber
16
Demi kelengkapan, perlu dicatat bahwa ada empat karakter baris baru di Unicode: \u000aatau \n, yang merupakan umpan baris; \u000datau \r, yang merupakan carriage return; \u2028, pemisah garis; dan \u2029, pemisah paragraf. Namun dalam praktiknya, kebanyakan regex yang Anda poskan cukup.
Mathias Bynens
4
@MathiasBynens Terima kasih, tetapi U + 2028 dan U + 2029 secara eksplisit bukan merupakan jeda baris dalam HTML (4.01), di mana nilai DOM tree dan textarea didasarkan pada: w3.org/TR/html4/struct/text.html #whitespace
PointedEars
5
@PointedEars Ya, tetapi serialisasi HTML tidak terjadi ketika mengatur textarea .valuesecara dinamis, misalnya textarea.value = 'a\u2029b'; textarea.value.charAt(1) == '\u2029'; // true. Tapi ini mungkin merupakan kasus tepi - seperti yang saya katakan, dalam banyak kasus regex Anda cukup.
Mathias Bynens
2
@MathiasBynens Karena U + 2028 dan U + 2029 bukan merupakan jeda baris dalam HTML (4.01), penugasan itu tidak menampilkan dua baris dalam textarea dengan implementasi DOM utama dan mesin tata letak. Jadi, tidak ada orang waras yang akan melakukan tugas seperti itu sejak awal.
PointedEars
1
Saya harus melarikan diri dari garis miring terbalik agar ini berfungsi untuk saya yaitu textIn.replace (/ (\\ r \\ n | \\ n | \\ r) / gm, ""). Masih +1. Terima kasih
Crab Bucket
513

Cara Anda menemukan jeda baris bervariasi di antara penyandian sistem operasi. Windows akan menjadi\r\n , tetapi Linux hanya menggunakan \ndan Apple menggunakan \r.

Saya menemukan ini di jeda baris JavaScript :

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

Itu harus menghapus semua jenis jeda baris.

Pendeta
sumber
19
Mengapa terpisah \r\n dan \n dan \r lebih baik dari sekadar /[\n\r]/g? Tentunya ini lebih lambat dari yang seharusnya, karena hanya perlu memeriksa setiap karakter terhadap himpunan dua opsi yang mungkin.
Hilang Coding
2
Ketika parsing mengembalikan data dari memcached di node.js menggunakan / [\ n \ r] / g melakukan trik untuk saya. Terima kasih sudah Coding! Opsi dalam jawaban menjaganya.
Kyle Coots
111

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

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

String.trim() menghapus spasi putih dari awal dan akhir string ... termasuk baris baru.

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!!!"

Berikut ini contoh biola: http://jsfiddle.net/BLs8u/

CATATAN! itu hanya memotong awal dan akhir string, bukan jeda baris atau spasi putih di tengah-tengah string.

RobW
sumber
34
Ini hanya menghilangkan jeda baris dari awal dan akhir string. OP bertanya bagaimana menghapus SEMUA jeda baris.
Ian Walter
4
Yap, hanya menambahkan sebagai opsi.
RobW
1
Bekerja untuk apa yang saya butuhkan - awal dan akhir string. Terima kasih!
Harlin
47

Anda dapat menggunakan \nregex untuk baris baru, dan \runtuk pengembalian carriage.

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

Sistem operasi yang berbeda menggunakan ujung jalur yang berbeda, dengan beragam campuran \ndan \r. Regex ini akan menggantikan semuanya.

Kendall Frey
sumber
Saya pikir ini hanya akan menggantikan kejadian pertama
Sebas
5
/\n|\r/glebih efisien ditulis /[\n\r]/gatau bahkan /[\n\r]+/g. Hindari pergantian kecuali Anda benar-benar membutuhkannya.
PointedEars
Tidak yakin apakah ini keluhan. Ia melakukan apa yang saya katakan: hapus SEMUA yang tidak ada dalam rentang HEX itu. Apa karakter yang tergantung pada set char tentu saja, tetapi posting ini adalah tentang ASCII.
masi
22

Jika Anda ingin menghapus semua karakter kontrol, termasuk CR dan LF, Anda dapat menggunakan ini:

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

Ini akan menghapus semua karakter yang tidak dapat dicetak. Ini semua karakter BUKAN dalam ruang ASCII HEX 0x20-0x7E. Jangan ragu untuk mengubah kisaran HEX sesuai kebutuhan.

masi
sumber
2
Itu juga akan menghapus beberapa karakter nasional dari bahasa selain bahasa Inggris ....
smentek
21

Solusi paling sederhana adalah:

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()dengan /\s+/gregexp mengubah semua grup karakter spasi-putih menjadi satu spasi di seluruh string, maka kita .trim()akan menghapus semua yang melebihi spasi putih sebelum dan sesudah teks.

Dianggap sebagai karakter spasi putih:
[ \f\n\r\t\v​\u00a0\u1680​\u2000​-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]

Freezystem
sumber
Luar biasa, tapi saya membuatnya bekerja menugaskan kembali variabel:str = str.replace(/\s+/g, ' ').trim();
Fred K
15
var str = "bar\r\nbaz\nfoo";

str.replace(/[\r\n]/g, '');

>> "barbazfoo"
Gordon Freeman
sumber
15

Untuk menghapus baris baru, gunakan ini:

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

Kemudian Anda dapat memotong string Anda untuk menghapus spasi awal dan akhir:

yourString.trim()
Si7ius
sumber
6

Jawaban yang diberikan oleh PointedEars adalah segalanya yang sebagian besar dari kita butuhkan. Tetapi dengan mengikuti jawaban Mathias Bynens, saya melakukan perjalanan Wikipedia dan menemukan ini: https://en.wikipedia.org/wiki/Newline .

Berikut ini adalah fungsi drop-in yang mengimplementasikan semua yang halaman Wiki di atas menganggap "baris baru" pada saat jawaban ini.

Jika sesuatu tidak sesuai dengan kasus Anda, hapus saja. Juga, jika Anda mencari kinerja, ini mungkin bukan itu, tetapi untuk alat cepat yang melakukan pekerjaan dalam hal apa pun, ini harus bermanfaat.

// 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`)
});
futz.co
sumber
3
Pertama - untuk orang yang menemukan ini tidak menggunakan JS - "sebagian besar" dukungan RE rasa \Ryang merupakan "semua" linefeeds. Kedua - mengapa tidak sederhanasomeString.replace(new RegExp(lineTerminators.join('|')), '');
SamWhan
@ Clas, Anda membuat poin yang bagus. Saya pikir garis pemikiran saya ketika saya menulis ini adalah hanya berjalan replace()untuk lineTerminatorsyang ada di string karena alasan kinerja.
futz.co
5

Linebreak di regex adalah \ n, jadi skrip Anda adalah

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

Saya menambahkan jawaban saya, itu hanya tambahan di atas, karena bagi saya saya mencoba semua opsi / n dan tidak berfungsi, saya melihat teks saya datang dari server dengan double slash jadi saya menggunakan ini:

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

GUNAKAN FUNGSI INI DI BAWAH DAN MEMBUAT HIDUP ANDA MUDAH

Pendekatan termudah adalah menggunakan ekspresi reguler untuk mendeteksi dan mengganti baris baru dalam string. Dalam hal ini, kami menggunakan fungsi ganti bersama dengan string untuk menggantikan dengan, yang dalam kasus kami adalah string kosong.

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

Dalam ungkapan di atas, g dan m adalah untuk bendera global dan multiline

vishu2124
sumber
2

Coba kode berikut. Ini bekerja di semua platform.

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'
Robson Morais Santos
sumber
0

Di mac, cukup gunakan \ndi regexp untuk mencocokkan linebreak. Jadi kodenya adalah string.replace(/\n/g, ''), ps: g yang diikuti berarti cocokkan semua, bukan hanya yang pertama.

Di windows, itu akan menjadi \r\n.

Kobako
sumber