Regex के साथ बैकस्लैश से बच नहीं सकते?


114

मैं निम्नलिखित रेगेक्स का उपयोग कर रहा हूं

^[a-zA-Z0-9\',!;\?\$\^:\\\/`\|~&\" @#%\*\{}\(\)_\+\.\s=-]{1,1000}$

मुझे पता है कि यह बदसूरत है, लेकिन अभी तक यह बैकस्लैश के अलावा अपने उद्देश्य को पूरा करने की अनुमति नहीं देता है क्योंकि मुझे लगता है कि यह होना चाहिए क्योंकि यह बच गया है, मैंने भी \\इसके बजाय \\\परिणामों की कोशिश की । कोई विचार?


4
मैंने शीर्षक में सिर्फ टाइपो तय किया है, लेकिन शीर्षक के बारे में गहराई से बहुत कुछ है "रेगेक्स के साथ प्रतिक्रिया से बच नहीं सकते?" वास्तव में!
एडम क्रॉसलैंड

1
@AdamCrossland हम सभी चाहते हैं कि रेगेक्स हमें बैकलैश से बचने में मदद न करें? > _>
ईटन बी।

2
हेक, मैं बस इच्छा करता हूं कि मैं रेगेक्स से बैकलैश से बच सकूं।
एडम क्रॉसलैंड

जवाबों:


226

यदि आप इसे एक प्रोग्राम के भीतर एक स्ट्रिंग में डाल रहे हैं, तो आपको वास्तव में चार बैकस्लैश का उपयोग करने की आवश्यकता हो सकती है (क्योंकि स्ट्रिंग पार्सर उनमें से दो को हटा देगा जब इसे स्ट्रिंग के लिए "डी-एस्केप" किया जाएगा , और फिर रेगेक्स को दो की आवश्यकता है बच गए रेगेक्स बैकस्लैश)।

उदाहरण के लिए:

regex("\\\\")

के रूप में व्याख्या की है ...

regex("\\" [escaped backslash] followed by "\\" [escaped backslash])

के रूप में व्याख्या की है ...

regex(\\)

एक रेक्सक्स के रूप में व्याख्या की जाती है जो एकल बैकलैश से मेल खाता है।


भाषा के आधार पर, आप उद्धरण के एक भिन्न रूप का उपयोग करने में सक्षम हो सकते हैं, जो बच निकलने के क्रम से बचने के लिए कई के रूप में उपयोग करने से बचता है - उदाहरण के लिए, पायथन में:

re.compile(r'\\')

rउद्धरण के सामने यह एक बनाता है कच्चे स्ट्रिंग जो नहीं पार्स बैकस्लैश पलायन करता है।


14
hehe ... मैं सिर्फ इस में भाग गया और तीन को जोड़ने की जरूरत है। मैं तब तक बैकस्लैश जोड़ता रहा जब तक कि यह काम नहीं कर गया।
billynoah

उम, क्यों पृथ्वी पर इस रेगेक्स को एक बार के बजाय दो बार पुनर्व्याख्या की गई जैसे कि यह पीसीआरई के लिए होना चाहिए?
जिम माइकल्स

3
@JimMichaels क्योंकि सभी भाषाएं रेगेक्स शाब्दिक नहीं हैं, और इस प्रकार कभी-कभी प्रोग्रामिंग लैंग्वेज स्वयं स्लैश एस्केप को एक बार इसके स्ट्रिंग सिंटैक्स में बदल देती है, और परिणामस्वरूप स्ट्रिंग फिर से रेक्सक्स इंजन के पास हो जाती है (जो स्लैश रेगेक्स सिंटैक्स में बच जाती है)।
अंबर

1
एक बार, बहुत पहले, मुझे एक तत्व के एक xpath पर कब्जा करना था जिसकी केवल पहचानने की विशेषता एक विंडोज़ फ़ाइल पथ थी, फिर एक प्रोग्राम (स्ट्रिंग के रूप में) उत्पन्न करें जिसमें xpath को स्ट्रिंग के रूप में दर्शाया जाए। मध्यवर्ती चरणों में एक बिंदु पर 8 बैकस्लैश थे जिनका उपयोग फ़ाइल पथ में एकल बैकस्लैश का प्रतिनिधित्व करने के लिए किया गया था। हालांकि मैंने कभी भी उच्चतम प्राप्त किया है।
ज़ैककेनियन

मेटा अक्षरों की आवश्यकता वाले पैटर्न के साथ बैकस्लैश की खोज करते समय यह और भी अधिक जटिल हो सकता है। उदाहरण के लिए, एक अंक के बाद एक बैकस्लैश ढूंढना। अब आप निम्नलिखित अभिव्यक्ति को देख रहे हैं जो यह पता लगाने की कोशिश कर रही है: क्या हो रहा है new RegExp('\\\\\\d');
जाबचेचा

15

यदि यह एक शाब्दिक नहीं है, तो आपको इसका उपयोग करना होगा \\\\ताकि आप प्राप्त कर सकें \\जिसका अर्थ है एक बचा हुआ बैकलैश।

ऐसा इसलिए है क्योंकि दो प्रतिनिधित्व हैं। अपने रेगेक्स के स्ट्रिंग प्रतिनिधित्व में, आपके पास है "\\\\", जो कि पार्सर को भेजा जाता है। पार्सर यह देखेगा \\कि यह एक मान्य एस्केप-बैकस्लैश के रूप में व्याख्या करता है (जो एक एकल बैकस्लैश से मेल खाता है)।


10

बैकस्लैश \नियमित अभिव्यक्तियों के लिए भागने का पात्र है। इसलिए एक डबल बैकस्लैश वास्तव में एकल, शाब्दिक बैकस्लैश होगा।

\ (backslash) followed by any of [\^$.|?*+(){} escapes the special character to suppress its special meaning.

रेफरी: http : //www. अनियमित-expressions.info/reference.html


4

Http : //www . अनियमित-expressions.info/charclass.html से :

ध्यान दें कि एक वर्ण वर्ग के अंदर केवल विशेष वर्ण या मेटाचैकर्स समापन कोष्ठक (]), बैकस्लैश (\\), कैरेट (^) और हाइफ़न (-) हैं। सामान्य मेटाचैकर्स एक चरित्र वर्ग के अंदर सामान्य पात्र हैं, और बैकस्लैश से बचने की आवश्यकता नहीं है। किसी स्टार या प्लस की खोज करने के लिए, [+ *] का उपयोग करें। यदि आप एक चरित्र वर्ग के अंदर नियमित रूप से मेटाचैकर से बचते हैं, तो आपका रेगेक्स ठीक काम करेगा, लेकिन ऐसा करने से पठनीयता में काफी कमी आती है।

एक चरित्र वर्ग के अंदर किसी विशेष अर्थ के बिना एक बैकस्लैश को शामिल करने के लिए, आपको इसे एक और बैकस्लैश के साथ बचना होगा। [\\ x] बैकस्लैश या x से मेल खाता है। समापन ब्रैकेट (]), कैरेट (^) और हाइफ़न (-) को बैकस्लैश के साथ भागने से, या उन्हें ऐसी स्थिति में रखकर शामिल किया जा सकता है जहाँ वे अपने विशेष अर्थ को नहीं लेते हैं। मैं बाद की विधि की सिफारिश करता हूं, क्योंकि यह पठनीयता में सुधार करता है। एक कैरेट को शामिल करने के लिए, इसे खोलने के ब्रैकेट के ठीक बाद कहीं भी रखें। [x ^] एक x या एक कैरेट से मेल खाता है। आप समापन ब्रैकेट को खोलने के ब्रैकेट, या नेगेटिंग कैरेट के ठीक बाद रख सकते हैं। [] x] एक समापन ब्रैकेट या एक एक्स से मेल खाता है। [^] x] किसी भी वर्ण से मेल खाता है जो एक समापन ब्रैकेट या x नहीं है। ओपनिंग ब्रैकेट के ठीक बाद, या क्लोजिंग ब्रैकेट से ठीक पहले, या नेगेटिंग कैरेट के ठीक बाद हाइफ़न को शामिल किया जा सकता है।

आप किस भाषा में रेगेक्स लिख रहे हैं?


0

इस समाधान ने br टैग को '\ n' में बदलने के दौरान मेरी समस्या को ठीक कर दिया।

alert(content.replace(/<br\/\>/g,'\n'));
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.