एक नियमित अभिव्यक्ति में आगे स्लैश से बचना


106

मेरा प्रश्न एक सरल है, और यह नियमित अभिव्यक्ति से बचने के बारे में है। क्या आपको /नियमित अभिव्यक्ति में आगे की स्लैश से बचना है ? और आप इसे कैसे करेंगे?


1
आप किस भाषा / नियमित अभिव्यक्ति के कार्यान्वयन का उपयोग करते हैं?
Gumbo

दिलचस्प रूप से पर्याप्त है, मैं जावास्क्रिप्ट के लिए इस सवाल की तलाश कर रहा था। लेकिन तब मेरी आईडीई ने कहा कि मैं एक अनावश्यक भागने का उपयोग कर रहा था। तो myStr.replace(/[/:.-]+/gi, '_')मेरे आश्चर्य के लिए मान्य है। मुझे लगा कि मुझे जरूरत है /[\/:.-]+/gi। मैं तय नहीं कर सकता कि यह शांत है या भ्रमित है।
टर्बो

जवाबों:


90

क्या संदर्भ / भाषा? कुछ भाषाएं /पैटर्न सीमांकक के रूप में उपयोग करती हैं , इसलिए हाँ, आपको इसे बचाना होगा, जो भाषा / संदर्भ पर निर्भर करता है। आप इसके सामने एक पिछड़े स्लैश डालकर बच जाते हैं: \/कुछ भाषाओं (जैसे PHP) के लिए आप अन्य पात्रों को सीमांकक के रूप में उपयोग कर सकते हैं और इसलिए आपको इससे बचने की आवश्यकता नहीं है। लेकिन सभी भाषाओं में AFAIK, केवल विशेष महत्व यह /है कि यह निर्दिष्ट पैटर्न परिसीमन हो सकता है।


38

यहाँ कुछ विकल्प दिए गए हैं:

  • पर्ल में, आप वैकल्पिक सीमांकक चुन सकते हैं। आप तक सीमित नहीं हैं m//। आप दूसरा चुन सकते हैं, जैसे कि m{}। फिर बचना जरूरी नहीं है। वास्तव में, "पर्ल बेस्ट प्रैक्टिसेज" में डेमियन कॉनवे का दावा है कि m{}एकमात्र वैकल्पिक सीमांकक है जिसका उपयोग किया जाना चाहिए, और यह पर्ल :: क्रिटिक (सीपीएन पर) द्वारा प्रबलित है। हालांकि आप विभिन्न प्रकार के वैकल्पिक सीमांकक वर्णों का उपयोग करके दूर हो सकते हैं, //और {}बाद में समझने के लिए सबसे स्पष्ट प्रतीत होते हैं। हालांकि, यदि उन विकल्पों में से कोई भी बहुत अधिक बच जाता है, तो जो भी अपने आप को सर्वश्रेष्ठता के लिए उधार देता है उसे चुनें। आम उदाहरण हैं m(...), m[...]और m!...!

  • ऐसे मामलों में जहां आप या तो वैकल्पिक सीमांकक का उपयोग नहीं कर सकते हैं या नहीं करना चाहते हैं, आप एक बैकस्लैश के साथ आगे की स्लैश से बच सकते हैं: m/\/[^/]+$/उदाहरण के लिए (एक वैकल्पिक सीमांकक जो बन सकता था m{/[^/]+$}, जो अधिक स्पष्ट रूप से पढ़ सकता है)। बैकस्लैश के साथ स्लैश को बचाना एक नाम और विकिपीडिया पृष्ठ के लिए पर्याप्त है: लीनिंग टूथपिक सिंड्रोम । नियमित अभिव्यक्तियों में जहां सिर्फ एक ही उदाहरण है, एक स्लैश से बचना संभव नहीं हो सकता है कि यह पठनीयता में बाधा माना जाता है, लेकिन अगर यह हाथ से बाहर निकलना शुरू हो जाता है, और अगर आपकी भाषा वैकल्पिक सीमांकक को अनुमति देती है जैसा कि पर्ल करता है, तो यह होगा पसंदीदा समाधान हो।


1
क्या आप एक उदाहरण दे सकते हैं? मेरे पास यह है: perl -pi -e "s/chdir .*/chdir $ROBOT_PATH/g" startup_scripts/supervisord.confऔर मैं आगे की स्लैश के साथ संघर्ष कर रहा हूं।
CMCDragonkai

ध्यान दें कि आप एक का उपयोग करते हैं s, न कि m, जब नियमित अभिव्यक्तियों के साथ एक प्रतिस्थापित (उर्फ स्थानापन्न) करते हैं। perlfect.com/articles/regex.shtml
मश्मगर

2
@CMCDragonkai perl -pi -e "s{chdir .*}{chdir $ROBOT_PATH}g" startup_scripts/supervisord.conf... लेकिन यह शायद बेहतर है: perl -pi -e 's/chdir .*/chdir $ENV{ROBOT_PATH}/g' startup_scripts/supervisord.confक्योंकि यह शेल प्रक्षेप से बचा जाता है।
डेविड

1
शाब्दिक /चरित्र से बचने का एक विकल्प हेक्स या ऑक्टल में अपने एएससीआईआई एन्कोडिंग द्वारा एक चरित्र को निर्दिष्ट करने की रीगेक्स कार्यक्षमता का उपयोग करना है। पर्ल ऑक्टल फॉर्म \57(स्रोत regular-expressions.info/refcharacters.html ) को स्वीकार करता है
lukeuser

Lukeuser (धन्यवाद) से जुड़े पृष्ठ में एस्केप सीक्वेंस \ Q ... \ E भी है। इसने मेरे लिए काम किया।
user3012857

11

बैकस्लैश का उपयोग करें \या एक अलग सी डिमाइटर चुनें, अर्थात "इन पर्ल के m#.\d#बजाय /.\d/, आप / नियमित अभिव्यक्ति सीमांकक को लगभग किसी भी अन्य विशेष चरित्र में बदल सकते हैं यदि आप इसे अक्षर m (मैच के लिए) के साथ जोड़ते हैं;"


6

यदि सीमांकक / है, तो आपको भागने की आवश्यकता होगी।


0

यदि आप C # का उपयोग कर रहे हैं, तो आपको इससे बचने की आवश्यकता नहीं है।


हो सकता है, लेकिन यहाँ वे पर्ल का उपयोग कर रहे हैं।
टोटो

0

जावा के लिए, आप की जरूरत नहीं है।

eg: "^(.*)/\\*LOG:(\\d+)\\*/(.*)$" ==> ^(.*)/\*LOG:(\d+)\*/(.*)$

यदि आप / के सामने \ _ डालते हैं। IDE आपको बताएगा "ReGex में अनावश्यक चरित्र पलायन" \ "

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