2010-07-10 5 views
22

मुझे यकीन है कि इससे पहले पूछा गया है, लेकिन मुझे यह नहीं मिल रहा है।लाइन ब्रेक हटाने के लिए क्रॉस प्लेटफ़ॉर्म रेगेक्स क्या है?

असल में, यह सोचते हैं आप अज्ञात मूल के एक पाठ फ़ाइल को पार्स और लाइन को बदलने के लिए कुछ अन्य सीमांकक के साथ टूट जाता है चाहते हैं, यह एक और सबसे अच्छा regex है, या नहीं है?

(\r\n)|(\n)|(\r)

+1

आप पुराने मैक शैली पंक्ति विराम की परवाह करते हैं ('\ r'), या केवल यूनिक्स और विंडोज के बारे में (' \ n' और '\ r \ n')? –

+1

क्रॉस प्लेटफॉर्म न्यूलाइन अक्षरों से मिलान करने के लिए नियमित अभिव्यक्ति का संभावित डुप्लिकेट] (http://stackoverflow.com/questions/1331815/regular-expression-to-match-cross-platform-newline-characters) – Amarghosh

उत्तर

33

फ्लेचर - इस से पहले एक बार पूछे जाते देखा था।

ये रहा: Regular Expression to match cross platform newline characters

  • बिगाड़ने चेतावनी!

regex का उपयोग मैं जब मैं सटीक होना चाहता हूँ "| \ n \ r \ n?" है। अपने regex इंजन \R एक आशुलिपि चरित्र वर्ग के रूप में समर्थन करता है तो

0

बस एक खाली स्ट्रिंग "" साथ /[\r\n]+/g बदलें।

यह सभी \r और \n को प्रतिस्थापित करेगा चाहे वे स्ट्रिंग में किस क्रम में दिखाई दें।

+0

यह किसी भी संख्या को प्रतिस्थापित करेगा एक प्रतिस्थापन टोकन के साथ लाइन ब्रेक। –

+0

@ एंड्रियास वह लाइन ब्रेक को हटाना चाहता है। – Amarghosh

+1

ठीक है, वह उन्हें एक और डिलीमीटर के साथ बदलना चाहता है ... –

20

जाँच करें और आप विभिन्न यूनिकोड न्यू लाइन/linefeed कॉम्बो के साथ संबंध होने की जरूरत नहीं होगी। यदि सही तरीके से कार्यान्वित किया गया है, तो आप \R का उपयोग करके पारदर्शी रूप से सभी विभिन्न एसीआईआई या यूनिकोड लाइन अंतराल से मेल खा सकते हैं।

यूनिकोड में आप (OS/390 लाइन समाप्त होने \ X85) NEL का पता लगाने की जरूरत है LS (रेखा विभाजक, \ x2028) और PS (पैराग्राफ़ विभाजक, \ x2029) यदि आप इन दिनों पूरी तरह से पार मंच होना चाहता हूँ।

यह बहस का मुद्दा है रास, नेल, और पी एस पंक्ति विराम, लाइन अंत या व्हाइट स्पेस के रूप में व्यवहार किया जाना चाहिए या नहीं। एक्सएमएल 1.0 मानक, उदाहरण के लिए, does not recognize एनईएल लाइन ब्रेक कैरेक्टर के रूप में। ईसीएमएस्क्रिप्ट LS और PS लाइन ब्रेक के रूप में व्यवहार करता है लेकिन NEL व्हाइटस्पेस के रूप में। Perl unicode regexs ^ और $ regex मेटा वर्ण के प्रयोजन के लिए पंक्ति विराम के रूप में VT, FF, CR, CRLF, NEL, LS और PS व्यवहार करेगा।

Unicode Implementation Guide (सेक्शन 5.8 और तालिका 5.3) शायद "न्यूलाइन" के निश्चित उपचार के बारे में सबसे अच्छा शर्त है।

आप केवल DOS/Windows/यूनिक्स/मैक क्लासिक वेरिएंट के साथ ascii साथ में चिंतित हैं, \R करने के लिए regex बराबर (?>\r\n|[\r\n])

यूनिकोड में है, \R के बराबर (?>\r\n|\n|\x0b|\f|\r|\x85|\x2028|\x2029)\x0b है में वहाँ एक ऊर्ध्वाधर टैब; एक बार फिर, यह लाइन लाइन ब्रेक की परिभाषा के अनुरूप हो सकता है या नहीं, लेकिन यह यूनिकोड इम्प्लांटेशन की सिफारिश से मेल खाता है। (FF, या \x0C रेगेक्स में शामिल नहीं है क्योंकि फॉर्म फीड एक नया पृष्ठ है, परिभाषा में एक नई पंक्ति नहीं है।)

+0

आपके उत्तर में "utf8" "यूनिकोड" होना चाहिए। यूटीएफ -8 केवल यूनिकोड चरित्र एन्कोडिंग में से एक है। –

+0

आप सही हैं, लेकिन जिन दस्तावेज़ों का मैं जिक्र कर रहा था (पीसीआरई मैनुअल) का एक ही मुद्दा था! संपादित करें ... – dawg

+2

जावा में, \ \ x2028 | \ x2029' भाग '\ u2028 | \ u2029' लिखा जाना चाहिए, क्योंकि '\ xhh' केवल 2-अंकों वाले हेक्स वर्ण मानों के लिए उपयोग किया जाता है, जबकि' \ uhhhh' 4 अंकों के हेक्स चरित्र मूल्यों के लिए प्रयोग किया जाता है। –

2

खोजने के लिए रेगुलर एक्सप्रेशन से किसी भी यूनिकोड लाइन टर्मिनेटर की तुलना में drewk यह लिखा है, कम से कम पर्ल में होना चाहिए (?>\x0D\x0A?|[\x0A-\x0C\x85\x{2028}\x{2029}]) बल्कि । सीधे 5.10.0 दस्तावेज से लिया गया (इसे बाद के संस्करणों में हटा दिया गया था)। नोट ब्रेसिज़ के बाद \x: U + 2029 \x{2029} लेकिन \x2029 एक ASCII खाली स्थान के (U + 0020) + अंक के 2 + एक अंकों 9. \n एक चरित्र वर्ग के बाहर है भी \x{0a} मैच के लिए गारंटी नहीं है है।

1

अपने मंच \R वर्ग के रूप में ऊपर @dawg ने सुझाव दिया समर्थन नहीं करता है, तो आप अभी भी अपने मंच नकारात्मक lookaround या चरित्र वर्ग घटाव का समर्थन करता है, तो एक बहुत ही सुंदर और मजबूत समाधान बनाने के लिए सक्षम हो सकता है (उदाहरण के लिए जावा वर्ग घटाव है में syntax[x&&[^y]] के माध्यम से)।

अधिकांश नियमित अभिव्यक्ति व्याकरण में, डॉट चरित्र को "न्यूलाइन कैरेक्टर को छोड़कर किसी भी चरित्र" के लिए परिभाषित किया गया है (उदाहरण के लिए, जावास्क्रिप्ट के लिए देखें, here)। आप निम्नलिखित विशेषताओं के साथ कुछ मेल खाते हैं:

    नहीं
  1. (newline चरित्र को छोड़कर किसी भी चरित्र) → न्यू लाइन चरित्र; और
  2. खाली स्थान के

के बाद से मैं वर्तमान में जावास्क्रिप्ट में काम कर रहा हूँ है, जो AFAIK \R आशुलिपि या चरित्र वर्ग घटाव नहीं है, मैं अभी भी नकारात्मक अग्रदर्शी उपयोग कर सकते हैं कि मैं क्या चाहते हैं। निम्नलिखित नियमित अभिव्यक्ति सभी नई-पंक्तियों से मेल खाता है:

/((?!.)\s)+/g 

और निम्नलिखित JavaScript कोड, कम से कम जब विंडोज 7 पर क्रोम 42.0.2311.90m में चलाने के लिए, नई-पंक्तियों कि जावास्क्रिप्ट (यानी "ECMAScript" के सभी प्रकार का सफाया @ dawg की तीसरी पैरा में उल्लेख किया है) को पहचानता है:

var input = "hello\r\n\f\v\u2028\u2029 world"; 
 
var output = input.replace(/((?!.)\s)+/g, ""); 
 
document.write(output); // hello world

संबंधित मुद्दे