क्या आप केवल रेगेक्स केस-असंवेदनशील का हिस्सा बना सकते हैं?


100

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

उदाहरण के लिए, मान लें कि मेरे पास एक स्ट्रिंग है:

fooFOOfOoFoOBARBARbarbarbAr

क्या होगा अगर मैं मामले की परवाह किए बिना "फू" की सभी घटनाओं का मिलान करना चाहता हूं, लेकिन मैं केवल ऊपरी-मामले "बार" के मिलान करना चाहता हूं?

आदर्श समाधान कुछ ऐसा होगा जो रेगेक्स फ्लेवर में काम करता है, लेकिन मुझे भाषा-विशिष्ट सुनने में भी दिलचस्पी है (धन्यवाद एस्पो )

संपादित करें

एस्पो प्रदान की गई लिंक बहुत मददगार थी। वहाँ एक अच्छा उदाहरण है अभिव्यक्ति के भीतर पर और बंद संशोधक के बारे में।

मेरे आकस्मिक उदाहरण के लिए, मैं ऐसा कुछ कर सकता हूं:

(?i)foo*(?-i)|BAR

जो मैच के मामले को सिर्फ मैच के भाग के लिए असंवेदनशील बनाता है।

यह जावास्क्रिप्ट, पायथन और कुछ अन्य को छोड़कर अधिकांश रेगेक्स कार्यान्वयन में काम करने लगता था (जैसा कि एस्पो ने उल्लेख किया है)।

जिन बड़े लोगों के बारे में मैं सोच रहा था (पर्ल, पीएचपी, .NET) सभी इनलाइन मोड में बदलाव का समर्थन करते हैं।


इस सवाल को "संशोधक" के तहत स्टैक ओवरफ्लो रेगुलर एक्सप्रेशन एफएक्यू में जोड़ा गया है ।
aliteralmind

जवाबों:


88

पर्ल आपको (? :) पैटर्न संशोधक का उपयोग करके अपनी नियमित अभिव्यक्ति के मामले को असंवेदनशील बनाने की सुविधा देता है।

आधुनिक रेगेक्स जायके आपको नियमित अभिव्यक्ति के केवल हिस्से में संशोधक लगाने की अनुमति देते हैं। यदि आप रेगेक्स के मध्य में संशोधक (ism) सम्मिलित करते हैं, तो संशोधक केवल रेगेक्स के हिस्से को संशोधक के दाईं ओर लागू करता है। आप उन्हें ऋण चिह्न के साथ पूर्ववर्ती मोड बंद कर सकते हैं। माइनस साइन के बाद सभी मोड बंद हो जाएंगे। उदा। (I-sm) केस असंवेदनशीलता को चालू करता है, और सिंगल-लाइन मोड और मल्टी-लाइन मोड दोनों को बंद कर देता है।

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

आप जल्दी से परीक्षण कर सकते हैं कि रेगेक्स स्वाद आप हैंडल मोड संशोधक का उपयोग कैसे कर रहे हैं। रेगेक्स (i) टी (? - i) सेंट को टेस्ट और टीईएसटी से मेल खाना चाहिए, लेकिन टीएसटी या टेस्ट नहीं।

स्रोत


6

आप किस भाषा का उपयोग कर रहे हैं? ऐसा करने का एक मानक तरीका कुछ इस तरह होगा / ([Ff] [Oo] {2} | BAR) / पर केस सेंसिटिविटी के साथ, लेकिन जावा में, उदाहरण के लिए, केस सेंसिटिव मॉडिफायर (? I) है जो सभी बनाता है? इसके दाईं ओर वर्ण असंवेदनशील और (? -आई) के मामले हैं जो संवेदनशीलता को बल देते हैं उस जावा रेगेक्स संशोधक का एक उदाहरण यहां पाया जा सकता है


+1 जब आप दोनों मामलों का मिलान कर सकते हैं तो इसे असंवेदनशील बनाने से क्यों परेशान हों
Nona Urbiz

11
@NonaUrbiz: क्योंकि अभिव्यक्ति (?i)foobarकी तुलना में अधिक पठनीय है[Ff][Oo]{2}[Bb][Aa][Rr]
Thanatos

1
और यह बढ़ सकता है क्योंकि जिस तरह से बहुत अधिक बालों और जटिल।
चॉप

6

दुर्भाग्य से केस-असंवेदनशील मिलान के लिए वाक्यविन्यास आम नहीं है। .NET में आप RegexOptions.IgnoreCase ध्वज या i? संशोधक का उपयोग कर सकते हैं


4

आप उपयोग कर सकते हैं

(?:F|f)(?:O|o)(?:O|o)

.Net ?: कोष्ठक में .Net का अर्थ है गैर-कैप्चरिंग, और इसका उपयोग केवल शब्दों को समूहीकृत करने के लिए किया जाता है | (या) कथन।


26
बेहतर विकल्प नहीं है [[एफएफ] [ऊ] [ऊ]? हाथ में उदाहरण के लिए आप भी जहाँ तक जा सकते हैं "[सीमांत बल] [ऊ] \ {2}" ;-)
Tomalak

4

यह सच है कि नियमित रूप से अभिव्यक्ति के केवल भाग के लिए टर्निंग मोड पर और बंद के रूप में वर्णित इनलाइन संशोधक पर भरोसा कर सकते हैं :

रेगेक्स (?i)te(?-i)stको परीक्षण से मेल खाना चाहिए और TEst, लेकिन नहीं teSTया नहीं TEST

हालाँकि, थोड़ा अधिक समर्थित सुविधा एक (?i:...)इनलाइन संशोधक समूह है (देखें संशोधक स्पैन )। वाक्यविन्यास है (?i:, तो वह पैटर्न जिसे आप कैस-असंवेदनशील बनाना चाहते हैं, और फिर ए )

(?i:foo)|BAR

रिवर्स : अपने पैटर्न एक केस संवेदी विकल्प के साथ संकलित किया गया है और आप एक regex मामले का एक हिस्सा संवेदनशील बनाने की जरूरत है, तो आप को जोड़ने -के बाद ?: (?-i:...)

विभिन्न भाषाओं में उदाहरण का उपयोग करता है (कोण कोष्ठक के साथ मिलान लपेटता है):

में समर्थित नहीं है , , , std::regex, ,

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