Bir dizeden tüm satır sonlarını kaldırma


440

Bir metin alanında bir metin var ve .value özniteliğini kullanarak okuyun.

Şimdi Enter, normal bir ifade ile .replace kullanarak metnimden tüm satır aralıklarını ( bastığınızda üretilen karakter ) kaldırmak istiyorum, ancak normal ifadede bir satır aralığını nasıl gösterebilirim?

Bu mümkün değilse, başka bir yol var mı?


Yanıtlar:


501

Bu muhtemelen bir SSS'dir. Her neyse, satır sonları (daha iyi: yeni satırlar) \r, Satır Başı (CR, eski Maclerde), Satır Besleme (LF, \nLinux dahil \r\nUnices üzerinde ) veya CR ve ardından LF ( WinDOS'ta) olabilir. (Başka bir cevabın aksine, bunun karakter kodlamasıyla ilgisi yoktur.)

Bu nedenle, RegExptüm değişkenlerle eşleşecek en verimli değişmez

/\r?\n|\r/

Bir dizedeki tüm yeni satırları eşleştirmek istiyorsanız, global bir eşleme kullanın,

/\r?\n|\r/g

sırasıyla. Daha sonra replacediğer birkaç cevapta önerilen yönteme geçin. (Muhtemelen yapmanız değil kelimeler sağlam kalır böylece, uzay karakterini yeni satır kaldırmak ancak örneğin, diğer boşluk ile değiştirmek istiyoruz.)


16
Tamlık uğruna, Unicode'da dört farklı yeni satır karakteri bulunduğuna dikkat edilmelidir: \u000aveya \nbir satır besleme; \u000dveya \rbir satır başı; \u2028bir çizgi ayırıcı; ve \u2029bir paragraf ayırıcısı. Yine de pratikte, gönderdiğiniz normal ifade çoğu durumda yeterlidir.
Mathias Bynens

4
Teşekkür @MathiasBynens ancak U + 2028 U + 2029 açıkça do not DOM ağacı ve textarea canlı değeri dayanmaktadır (4.01), HTML satır sonları teşkil: w3.org/TR/html4/struct/text.html #whitespace
PointedEars

5
@PointedEars Evet, ancak textarea'nın .valuedinamik olarak ayarlanması sırasında HTML serileştirmesi gerçekleşmez , örn textarea.value = 'a\u2029b'; textarea.value.charAt(1) == '\u2029'; // true. Ama bu muhtemelen bir uç durumdur - dediğim gibi, çoğu durumda normal ifadeniz yeterlidir.
Mathias Bynens

2
U + 2028 U + 2029 (4.01) HTML satır sonları teşkil yapmadığından @MathiasBynens, bu atama yok değil herhangi bir büyük DOM uygulaması ve düzen motoru ile textarea içinde iki satır gösterir. Yani aklı başında hiç kimse ilk etapta böyle bir görev alamazdı.
PointedEars

1
Bu benim için çalışmak için ters eğik çizgiden kaçmak zorunda kaldı yani textIn.replace (/ (\\ r \\ n | \\ n | \\ r) / gm, ""). +1 hareketsiz. Teşekkür ederim
Yengeç Kovası

512

Satır sonunu nasıl bulacağınız işletim sistemi kodlamaları arasında farklılık gösterir. Windows olurdu \r\n, ancak Linux sadece kullanır \nve Apple kullanır \r.

Bunu JavaScript satır sonlarında buldum :

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

Bu, her türlü satır sonunu kaldırmalıdır.


18
Neden ayrı yaşıyor \r\n ve \n ve \r sadece daha iyi /[\n\r]/g? Elbette bu olması gerekenden daha yavaştır, çünkü her bir karakteri iki olası seçenek kümesine karşı kontrol etmesi gerekir.
Gone Coding

2
/ [\ N \ r] / g kullanarak node.js dosyasında memcached'dan döndürülen verileri ayrıştırırken benim için hile yaptı. Teşekkür Kodlama gitti! Yanıttaki seçenek onu bozdu.
Kyle Coots

111

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

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

String.trim() boşlukları dizelerin başından ve sonundan kaldırır ... yeni satırlar dahil.

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

İşte bir keman: http://jsfiddle.net/BLs8u/

NOT! dizenin ortasındaki satır sonlarını veya boşlukları değil, yalnızca dizenin başlangıcını ve sonunu keser.


34
Bu yalnızca satır sonlarını dizenin başından ve sonundan kaldırır. OP, TÜM satır sonlarının nasıl kaldırılacağını sordu.
Ian Walter

4
Evet, sadece bir seçenek olarak eklemek.
Rob

1
İhtiyacım olan şey için çalıştım - ipin başlangıcı ve sonu. Teşekkürler!
Harlin

46

Yeni \nsatırlar ve \rsatır başları için normal ifadelerde kullanabilirsiniz .

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

Farklı işletim sistemleri çeşitli karışımları ile, farklı çizgi uçlarının kullanımı \nve \r. Bu normal ifade bunların yerini alacak.


Bence bu sadece ilk oluşumun yerini alacak
Sebas

5
/\n|\r/gdaha verimli yazılır /[\n\r]/ghatta /[\n\r]+/g. Kesinlikle ihtiyacınız olmadığı sürece dönüşümden kaçının.
PointedEars

Bunun bir şikayet olup olmadığından emin değilim. Söylediklerimi yapıyor: HEX aralığında olmayan HERŞEYİ kaldırın. Hangi karakterlerin elbette karakter setine bağlıdır, ancak bu yazı ASCII hakkındaydı.
masi

22

CR ve LF dahil tüm kontrol karakterlerini kaldırmak istiyorsanız, bunu kullanabilirsiniz:

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

Yazdırılamayan tüm karakterleri kaldıracaktır. Bu karakterlerin hepsi ASCII HEX alanında DEĞİLDİR0x20-0x7E . HEX aralığını gerektiği gibi değiştirmekten çekinmeyin.


2
Bu, İngilizce dışındaki dillerden bazı ulusal karakterleri de kaldıracaktır ....
smentek

21

En basit çözüm:

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()ile /\s+/gregexp değişiyor Tüm grupları bütün dizede tek alana beyaz boşluk karakterleri sonra .trim()sonucu önce ve sonra metni tüm aşan beyaz boşluk kaldırmak için.

Beyaz boşluk karakterleri olarak kabul edilir:
[ \f\n\r\t\v​\u00a0\u1680​\u2000​-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]


Harika, ama değişkeni yeniden atayarak çalışıyorum:str = str.replace(/\s+/g, ' ').trim();
Fred K


15

Yeni çizgi karakterlerini kaldırmak için şunu kullanın:

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

Ardından, önde gelen ve sondaki boşlukları kaldırmak için dizenizi kırpabilirsiniz:

yourString.trim()

6

PointedEars'ın verdiği cevap çoğumuzun ihtiyaç duyduğu her şeydir. Ancak Mathias Bynens'in cevabını takip ederek bir Wikipedia gezisine çıktım ve bunu buldum: https://en.wikipedia.org/wiki/Newline .

Aşağıdakiler, yukarıdaki Wiki sayfasının bu yanıt sırasında "yeni satır" olarak kabul ettiği her şeyi uygulayan bir bırakma işlevidir.

Davanıza bir şey uymuyorsa, çıkarın. Ayrıca, performans arıyorsanız, bu olmayabilir, ancak her durumda işi yapan hızlı bir araç için bu yararlı olacaktır.

// 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
İlk - JS kullanmayan insanlar için - "en" RE tatlar desteği \Rolan "tüm" hat besleme. İkincisi - neden basit değilsomeString.replace(new RegExp(lineTerminators.join('|')), '');
SamWhan

@ClasG, iyi bir noktaya değindin. Sanırım bunu yazarken düşüncem sadece performans nedenleriyle dizede var olan için çalıştırmak replace()oldu lineTerminators.
futz.co

5

Normal ifadede bir satır sonu \ n olduğundan, komut dosyanız

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

5

Benim cevabımı ekliyorum, bu sadece bir addon, benim için tüm / n seçeneklerini denedim ve işe yaramadı, metnimin sunucudan çift eğik çizgi ile geldiğini gördüm, bu yüzden bunu kullandım:

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

5

BU FONKSİYONU AŞAĞIDAKİ KULLANIN VE YAŞAMINIZI KOLAY YAPIN

En kolay yaklaşım, dizedeki yeni satırları algılamak ve değiştirmek için düzenli ifadeler kullanmaktır. Bu durumda, değiştirmek için string ile birlikte replace işlevini kullanırız, bu durumda boş bir dize olur.

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

Yukarıdaki ifadede, g ve m global ve çok satırlı bayraklar içindir


2

Aşağıdaki kodu deneyin. Tüm platformlarda çalışır.

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

Mac'te \nçizgi satırlarını eşleştirmek için regexp'de kullanın. Yani kod şu olacaktır string.replace(/\n/g, ''): ps: izlenen g, sadece ilk yerine tümüyle eşleştiği anlamına gelir.

Pencerelerde olacak \r\n.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.