मैच की रेखाएं - \ n या \ r \ n?


159

इस उत्तर को लिखते समय , मुझे s-flag ( dotall- dot मैचों linebreaks) का उपयोग करने के बजाय लाइनब्रीक पर विशेष रूप से मेल खाना था ।

साइटों को आमतौर पर रेगुलर एक्सप्रेशन के परीक्षण के लिए इस्तेमाल किया अलग तरीके से व्यवहार करते समय पर मैच के लिए कोशिश कर रहा है \nया \r\n

मैंने ध्यान दिया

  • Regex101 केवल लाइनब्रीक पर मेल खाता है \n
    ( उदाहरण - हटाएं \rऔर यह मेल खाता है)

  • RegExr लाइनब्रेक से मेल खाता पर \n है और न ही पर \r\n
    और मैं कुछ यह एक LINEBREAK मिलान करने के लिए नहीं मिल रहा, के अलावा कर सकते हैं m-flag और \s
    ( उदाहरण )

  • Debuggex भी अधिक अलग बर्ताव करता है:
    में इस उदाहरण यह केवल पर से मेल खाता है \r\n, जबकि
    यहाँ यह केवल पर से मेल खाता है \nएक ही झंडे और इंजन निर्दिष्ट के साथ,

मैं m-flag (बहुस्तरीय - पूरी तरह ^से शुरू और $एक पंक्ति के अंत से मेल खाता है ) से अवगत हूं , लेकिन कभी-कभी यह एक विकल्प नहीं है। के साथ भी \s, यह टैब और रिक्त स्थान से मेल खाता है, भी।

यूनिकोड न्यूलाइन कैरेक्टर ( \u0085) का उपयोग करने का मेरा विचार सफल नहीं था, इसलिए:

  1. क्या मैच को एक लाइनब्रेक (अधिमानतः प्रयुक्त भाषा की परवाह किए बिना) को एक नियमित अभिव्यक्ति में एकीकृत करने का एक विफल तरीका है?
  2. उपर्युक्त साइटें अलग-अलग व्यवहार क्यों करती हैं (विशेष रूप से डीबगेज, केवल \nएक बार और केवल एक बार मिलान \r\n)?

15
आप कोशिश कर सकते हैं [\r\n]+- या ऐसा कुछ
Iłya Bursov

3
मैं उपयोग करता हूं: \r?\nदोनों \r\nऔर \nलाइन समाप्ति दृश्यों का मिलान करने के लिए । यह पुराने \rमैक सिंटैक्स के लिए काम नहीं करता है , लेकिन इन दिनों बहुत दुर्लभ है।
सवार 14

6
अरे, मैं डिबगेज का संस्थापक हूं। यह बग की तरह दिखता है (डीबगेज के लिए, मैं दूसरों के लिए नहीं बोल सकता)। मैंने इस प्रश्न का संदर्भ देते हुए एक उच्च-प्राथमिक मुद्दा जोड़ा है। हम इसे जल्द से जल्द प्राप्त करेंगे - हम वर्तमान में किसी अन्य उत्पाद को लॉन्च करने पर अपने सभी (बहुत सीमित) संसाधनों पर ध्यान केंद्रित कर रहे हैं।
सर्गीउ तोर्का

2
मैक को सिंटैक्स जोड़ने के लिए @ridgerunner, आप कर सकते हैं (\ r? \ n | \ r), जो पीटर वैन डेर वाल के जवाब के समान है, लेकिन अधिक कॉम्पैक्ट (10 वर्ण बनाम 12 वर्ण)।
डॉकटोर जे। जूल

जवाबों:


220

विपरीत दिशा में जवाब।

2) के बारे में एक पूरी व्याख्या के लिए \rऔर \nमुझे इस प्रश्न का उल्लेख करना होगा, जो कि मेरे द्वारा पोस्ट किए जाने की तुलना में कहीं अधिक पूर्ण है: \ n और \ r के बीच अंतर?

छोटी कहानी, लिनक्स \nएक नई-लाइन, विंडोज \r\nऔर पुराने मैक के लिए उपयोग करता है \r। इसलिए एक नई पंक्ति लिखने के कई तरीके हैं। आपका दूसरा टूल (RegExr) उदाहरण के लिए सिंगल पर मैच करता है \r

1) [\r\n]+जैसा कि इल्या ने सुझाव दिया है कि काम करेगा, लेकिन कई लगातार नई लाइनों से भी मेल खाएगा। (\r\n|\r|\n)अधिक सही है।


तो, \r/ \nऑपरेटिंग सिस्टम पर निर्भर हैं - यह एक ऐसी चीज है जो किसी को भी पता हो सकती है (?) - लेकिन दो डिबगेज-उदाहरण एक बार \ r \ n और एक बार \ n पर क्यों मेल खाते हैं? कम से कम मेरे लिए कोई अंतर नहीं है (उदाहरणों में)।
KeyNone

सबसे अधिक संभावना है क्योंकि आपने अपने विंडोज़ टेक्स्ट एडिटर में से एक को कॉपी किया था और दूसरे को आपने सीधे डिबगैक्स टेक्स्टारिया में लिखा था। प्रत्येक ने अलग-अलग लाइन ब्रेक का उपयोग किया।
ओगाजा

1
वास्तव में, क्योंकि आपके तीसरे उदाहरण में (वरिष्ठ पुरुष ...) \r\nपाठ में एक है (यदि आप राइट-क्लिक करते हैं और स्रोत दिखाते हैं, तो आप {{Infobox XC Championships\r\n|Name =कहीं मिलेंगे )। दूसरा टूल फ्लैश में लिखा गया है और जैसा कि आप के बारे में पेज newline- वर्ण के साथ एक छोटी गाड़ी है।
पीटर वैन डर वाल

1
(\r\n|\r|\n)अधिक सरल रूप में लिखा जा सकता है\r\n?
असद सईदुद्दीन

2
@AsadSaeeduddin नहीं, यह नहीं हो सकता। यह यूनिक्स लाइन-एंडिंग\n
पीटर वैन डेर वाल

12

आपके पास डिबगएक्स में उदाहरण ग्रंथों में अलग-अलग लाइन अंत है। यह विशेष रूप से दिलचस्प है कि डीबगेज ने यह पता लगाया है कि आपने पहले कौन सी लाइन एंडिंग शैली का उपयोग किया था, और यह उस शैली में दर्ज सभी अतिरिक्त लाइन एंडिंग को परिवर्तित करता है।

मैंने Unix और Windows प्रारूप में नमूना पाठ को Debuggex में पेस्ट करने के लिए Notepad ++ का उपयोग किया, और जो भी मैंने पहले चिपकाया, वह है कि Debuggex का सत्र किसके साथ अटका हुआ है।

इसलिए, आपको अपने पाठ संपादक के माध्यम से अपने पाठ को डिबगएक्स में चिपकाने से पहले धोना चाहिए। सुनिश्चित करें कि आप अपनी इच्छित शैली चिपका रहे हैं। डिबगएक्सएक्स यूनिक्स शैली (\ n) को डिफॉल्ट करता है।

इसके अलावा, एनईएल (\ u0085) पूरी तरह से कुछ अलग है: https://en.wikipedia.org/wiki/Newline#Uodeode

(\r?\n)यूनिक्स और विंडोज को कवर करेगा। (\r\n|\r|\n)यदि आप पुराने मैक से भी मिलान करना चाहते हैं , तो आपको कुछ अधिक जटिल चीज़ों की आवश्यकता होगी ।


डीबगेज के बारे में बहुत दिलचस्प बिंदु! इसके अलावा, \ u0085 की ओर इशारा करने के लिए धन्यवाद, वहां गुमराह हो गया!
KeyNone

3

पीसीआरई \Rमैचों में \n, \rऔर \r\n


कोई सवाल नहीं है
सैंडवेल

1
@ सैंडवेल: क्षमा करें, मैं आपको नहीं मिला, यह एक सवाल नहीं है, यह एक उत्तर है, इससे भी सरल(\r\n|\r|\n)
टोटो

2

यह केवल प्रश्न 1 पर लागू होता है।

मेरे पास एक ऐप है जो विंडोज पर चलता है और एक बहु-पंक्ति एमएफसी संपादक बॉक्स का उपयोग करता है।
संपादक बॉक्स को उम्मीद है कि CRLF लाइनब्रेक होगा, लेकिन मुझे
कुछ वास्तव में बड़े / गंदा रीजैक्स के साथ दर्ज पाठ को पार्स करने की आवश्यकता है ।

मैं रेगेक्स लिखते समय इस बारे में जोर नहीं देना चाहता था, इसलिए
मैंने पार्सर और संपादक के बीच आगे-पीछे के सामान्यीकरण को समाप्त कर दिया ताकि
रेगेक्स का सिर्फ उपयोग हो \n। मैं पेस्ट ऑपरेशन भी करता हूं और उन्हें बक्सों के लिए परिवर्तित करता हूं।

इसमें ज्यादा समय नहीं लगता है।
यही है वह जो मेरे द्वारा उपयोग किया जाता है।

 boost::regex  CRLFCRtoLF (
     " \\r\\n | \\r(?!\\n) "
     , MODx);

 boost::regex  CRLFCRtoCRLF (
     " \\r\\n?+ | \\n "
     , MODx);


 // Convert (All style) linebreaks to linefeeds 
 // ---------------------------------------
 void ReplaceCRLFCRtoLF( string& strSrc, string& strDest )
 {
    strDest  = boost::regex_replace ( strSrc, CRLFCRtoLF, "\\n" );
 }

 // Convert linefeeds to linebreaks (Windows) 
 // ---------------------------------------
 void ReplaceCRLFCRtoCRLF( string& strSrc, string& strDest )
 {
    strDest  = boost::regex_replace ( strSrc, CRLFCRtoCRLF, "\\r\\n" );
 }

2

पायथन में:

# as Peter van der Wal's answer
re.split(r'\r\n|\r|\n', text, flags=re.M) 

या अधिक कठोर:

# https://docs.python.org/3/library/stdtypes.html#str.splitlines
str.splitlines()
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.