एक स्ट्रिंग से सभी पंक्ति विराम कैसे निकालें


440

मेरे पास एक textarea में एक पाठ है और मैंने इसे .value विशेषता का उपयोग करके पढ़ा है।

अब मैं Enterएक नियमित अभिव्यक्ति के साथ .replace का उपयोग करते हुए अब अपने पाठ से सभी लाइनब्रेक (जब आप दबाते हैं तो उत्पन्न होता है ) को हटाना चाहते हैं, लेकिन मैं एक रेगेक्स में एक लाइनब्रेक कैसे इंगित करूं?

यदि यह संभव नहीं है, तो क्या कोई और तरीका है?


जवाबों:


501

यह शायद एक FAQ है। किसी भी तरह, पंक्ति विराम (बेहतर: नई-पंक्तियों) (सीआर, कैरिज रिटर्न में से एक हो सकता है \r, पुराने Macs पर), रेखा फ़ीड (वामो, \n, Unices सहित लिनक्स पर।) या सीआर वामो द्वारा (पीछा किया \r\n, windos पर)। (एक अन्य उत्तर के विपरीत, इसका चरित्र एन्कोडिंग से कोई लेना- देना नहीं है।)

इसलिए, RegExpसभी वेरिएंट्स का मिलान करने के लिए सबसे कुशल शाब्दिक है

/\r?\n|\r/

यदि आप एक स्ट्रिंग में सभी न्यूलाइन्स का मिलान करना चाहते हैं, तो एक वैश्विक मैच का उपयोग करें,

/\r?\n|\r/g

क्रमशः। फिर replaceविधि के साथ आगे बढ़ें जैसा कि कई अन्य उत्तरों में बताया गया है। (संभवत: आप नई वर्णमाला को हटाना नहीं चाहते हैं, लेकिन उन्हें अन्य व्हाट्सएप से बदल दें, उदाहरण के लिए अंतरिक्ष वर्ण, ताकि शब्द बरकरार रहें।)


16
पूर्णता के लिए, यह ध्यान दिया जाना चाहिए कि यूनिकोड में चार अलग-अलग नई लाइन वर्ण हैं: \u000aया \n, जो कि एक लाइन फीड है; \u000dया \r, जो एक गाड़ी वापसी है; \u2028, एक लाइन विभाजक; और \u2029, एक पैरा विभाजक। हालांकि व्यवहार में, आपके द्वारा पोस्ट किया गया रेगेक्स ज्यादातर मामलों में पर्याप्त है।
मैथियास ब्यनेंस

4
@MathiasBynens धन्यवाद, लेकिन U + 2028 और U + 2029 स्पष्ट रूप से HTML (4.01) में लाइन ब्रेक का गठन नहीं करते हैं , जो DOM ट्री और टेक्सारिया
पॉइंटेडर्स

5
@PointedEars हाँ, लेकिन HTML सीरियलाइज़ेशन तब नहीं होता है जब टेक्स्टरी के .valueगतिशील रूप से सेट किया जाता है , जैसे textarea.value = 'a\u2029b'; textarea.value.charAt(1) == '\u2029'; // true। लेकिन यह शायद एक किनारे का मामला है - जैसा कि मैंने कहा, ज्यादातर मामलों में आपका रेगेक्स पर्याप्त है।
मैथियास ब्यनेंस

2
@MathiasBynens क्योंकि U + 2028 और U + 2029 HTML (4.01) में लाइन ब्रेक का गठन नहीं करते हैं, यह असाइनमेंट textarea में दो लाइनों को किसी भी प्रमुख DOM कार्यान्वयन और लेआउट इंजन के साथ प्रदर्शित नहीं करता है । तो उनके सही दिमाग में कोई भी पहली बार में ऐसा काम नहीं करेगा।
पॉइंटेडर्स

1
मुझे मेरे लिए यह काम पाने के लिए बैकस्लैश से बचना पड़ा अर्थात textIn.replace (/ (\\ r \\ n | \\ n। \\ r) / gm, "")। +1 अभी भी। धन्यवाद
केकड़ा बाल्टी

511

आप कैसे पा सकते हैं कि एक लाइन ब्रेक ऑपरेटिंग सिस्टम एन्कोडिंग के बीच भिन्न होता है। विंडोज होगा \r\n, लेकिन लिनक्स सिर्फ उपयोग करता है \nऔर Apple उपयोग करता है \r

मैंने इसे जावास्क्रिप्ट लाइन ब्रेक में पाया :

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

कि सभी प्रकार के लाइन ब्रेक को हटा देना चाहिए।


18
क्यों अलग हो रही है \r\n और \n और \r बस की तुलना में बेहतर /[\n\r]/g? निश्चित रूप से यह धीमा होना चाहिए क्योंकि यह केवल दो संभावित विकल्पों के सेट के खिलाफ प्रत्येक चरित्र की जांच करने की आवश्यकता है।
कोडिंग हुआ

2
जब पार्सिंग ने नोड में डेटा वापस लौटाया। नोड का उपयोग करके / [\ n \ r] / g ने मेरे लिए चाल चली। धन्यवाद गया कोडिंग! उत्तर में विकल्प ने उसे दबा दिया।
काइल कोट्स ने

111

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

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

String.trim() स्ट्रिंग्स की शुरुआत और अंत से व्हाट्सएप हटाता है ... जिसमें न्यूलाइन भी शामिल हैं।

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

यहाँ एक उदाहरण है बेला: http://jsfiddle.net/BLs8u/

ध्यान दें! यह केवल स्ट्रिंग की शुरुआत और अंत को ट्रिगर करता है, न कि स्ट्रिंग के बीच में लाइन ब्रेक या व्हाट्सएप को।


33
यह केवल स्ट्रिंग की शुरुआत और अंत से लाइन ब्रेक को हटाता है। ओपी ने पूछा कि सभी लाइन ब्रेक कैसे हटाएं।
इयान वाल्टर

4
हां, सिर्फ एक विकल्प के रूप में जोड़ना।
रॉब

1
स्ट्रिंग की शुरुआत और अंत - मुझे जो चाहिए, उसके लिए काम किया। धन्यवाद!
हरलीन

46

आप \nnewlines के लिए एक regex में, और \rगाड़ी के रिटर्न के लिए उपयोग कर सकते हैं ।

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

अलग-अलग ऑपरेटिंग सिस्टम अलग-अलग लाइन एंडिंग्स का उपयोग करते हैं, जिनमें से अलग-अलग मिश्रण होते हैं \nऔर \r। यह रेगेक्स उन सभी को बदल देगा।


मुझे लगता है कि यह केवल पहली घटना को बदल देगा
सेबास

5
/\n|\r/gअधिक कुशलता से लिखा है /[\n\r]/gया भी है /[\n\r]+/g। जब तक आप पूरी तरह से इसकी आवश्यकता न हो तब तक विकल्प से बचें।
पॉइंटेडर्स

यकीन नहीं होता कि अगर यह शिकायत है। यह वही है जो मैंने कहा था: हर उस HEX रेंज में नहीं निकालें। चार के पाठ्यक्रम पर निर्भर करता है, लेकिन यह पोस्ट ASCII के बारे में थी।
मासी

22

यदि आप CR और LF सहित सभी नियंत्रण वर्ण हटाना चाहते हैं, तो आप इसका उपयोग कर सकते हैं:

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

यह सभी गैर-मुद्रण योग्य वर्णों को निकाल देगा। यह सभी वर्ण ASCII HEX स्थान के भीतर नहीं हैं 0x20-0x7E। आवश्यकतानुसार HEX रेंज को संशोधित करने के लिए स्वतंत्र महसूस करें।


2
यह अंग्रेजी के अलावा अन्य भाषाओं के कुछ राष्ट्रीय चरित्रों को भी हटा देगा ....
11

21

सबसे सरल उपाय होगा:

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()/\s+/gregexp के साथ पूरे स्ट्रिंग में एक ही स्थान पर सफेद-रिक्त स्थान वर्णों के सभी समूहों को बदल रहा है, फिर हम .trim()पाठ से पहले और बाद में सभी रिक्त स्थान को हटा दें।

श्वेत-रिक्त स्थान वाले वर्ण माने जाते हैं:
[ \f\n\r\t\v​\u00a0\u1680​\u2000​-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]


बहुत बढ़िया, लेकिन मुझे यह काम करने के लिए वैरिएबल को फिर से असाइन करना है:str = str.replace(/\s+/g, ' ').trim();
फ्रेड के


15

नई लाइन वर्ण को हटाने के लिए इसका उपयोग करें:

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

तब आप अग्रणी और अनुगामी रिक्त स्थान को निकालने के लिए अपनी स्ट्रिंग ट्रिम कर सकते हैं:

yourString.trim()

6

पॉइंटएडर्स द्वारा प्रदान किया गया उत्तर वह सब कुछ है जिसकी हमें सबसे अधिक आवश्यकता है। लेकिन मैथियास ब्यनेंस के उत्तर का पालन करते हुए, मैं एक विकिपीडिया यात्रा पर गया और यह पाया: https://en.wikipedia.org/wiki/Newline

निम्नलिखित एक ड्रॉप-इन फ़ंक्शन है जो इस उत्तर के समय उपरोक्त सभी विकी पृष्ठ को "नई पंक्ति" मानता है।

अगर कुछ आपके मामले में फिट नहीं है, तो इसे हटा दें। इसके अलावा, यदि आप प्रदर्शन की तलाश कर रहे हैं तो यह नहीं हो सकता है, लेकिन एक त्वरित उपकरण के लिए जो किसी भी मामले में काम करता है, यह उपयोगी होना चाहिए।

// 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
पहला - जेएस का उपयोग न करने वाले लोगों के लिए - "सबसे" आरई फ्लेवर समर्थन \Rजो "सभी" लाइनफीड है। दूसरी बात - बस क्यों नहींsomeString.replace(new RegExp(lineTerminators.join('|')), '');
समवन

@ClasG, आप एक अच्छा बिंदु बनाते हैं। मैं सोचा था की मेरी लाइन लगता है कि जब मैंने लिखा यह केवल चलाने के लिए था replace()के लिए lineTerminatorsहै कि प्रदर्शन के कारणों के लिए स्ट्रिंग में ही अस्तित्व में।
futz.co

5

Regex में एक लाइनब्रेक \ n है, इसलिए आपकी स्क्रिप्ट होगी

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

5

मैं अपना उत्तर जोड़ रहा हूं, यह ऊपर के लिए एक addon है, जैसा कि मेरे लिए मैंने सभी / n विकल्पों की कोशिश की और यह काम नहीं किया, मैंने देखा कि मेरा पाठ डबल स्लैश के साथ सर्वर से आ रहा है इसलिए मैंने इसका उपयोग किया:

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

5

इस उत्सव का उपयोग करें और अपने जीवन को आसान बनाएं

सबसे आसान दृष्टिकोण स्ट्रिंग में नई रेखाओं का पता लगाने और बदलने के लिए नियमित अभिव्यक्तियों का उपयोग कर रहा है। इस स्थिति में, हम स्ट्रिंग के साथ-साथ फ़ंक्शन को प्रतिस्थापित करने के लिए उपयोग करते हैं, जो हमारे मामले में एक रिक्त स्ट्रिंग है।

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

उपरोक्त अभिव्यक्ति में, जी और एम वैश्विक और बहुस्तरीय झंडे के लिए हैं


2

निम्नलिखित कोड का प्रयास करें। यह सभी प्लेटफार्मों पर काम करता है।

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

मैक पर, \nलाइनब्रीक से मिलान करने के लिए बस regexp में उपयोग करें । तो कोड होगा string.replace(/\n/g, ''), पीएस: जी के बाद का मतलब सिर्फ पहले के बजाय सभी से मेल खाता है।

खिड़कियों पर, यह होगा \r\n

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.