2008-09-04 13 views
83

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

उदाहरण के लिए, मान लीजिए कि मैं इस तरह एक स्ट्रिंग डालते हैं:

fooFOOfOoFoOBARBARbarbarbAr 

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

आदर्श समाधान कुछ है कि regex जायके में काम करता है (धन्यवाद Espo) होगा, लेकिन मैं भी सुनवाई भाषा-विशिष्ट लोगों में दिलचस्पी रखता हूँ

संपादित

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

मेरी काल्पनिक उदाहरण के लिए, मैं कुछ इस तरह कर सकते हैं:

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

जो मैच केस-संवेदी मैच में से केवल foo भाग के लिए बनाता है।

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

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

+0

यह सवाल [स्टैक ओवरफ़्लो नियमित अभिव्यक्ति पूछे जाने वाले प्रश्न] (http://stackoverflow.com/a/22944075/2736496) में जोड़ा गया है, "संशोधक" के तहत। – aliteralmind

उत्तर

77

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

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

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

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

Source

+0

एचजी/mercurial पर काम करता है। बहुत बढ़िया! – RubyTuesdayDONO

4

आप इस्तेमाल कर सकते हैं

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

: नेट में कोष्ठक में मतलब है कि यह गैर-कैप्चरिंग है, और सिर्फ समूह के लिए के संदर्भ में इस्तेमाल किया | (या) कथन।

+24

"[एफएफ] [ओओ] [ओओ]" बेहतर विकल्प नहीं है? उदाहरण के लिए आप "[एफएफ] [ओओ] \ {2}" ;-) – Tomalak

5

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

+0

+1 तक भी जा सकते हैं, जब आप दोनों मामलों से मेल खाते हैं तो यह मामला असंवेदनशील क्यों है –

+5

@NonaUrbiz: क्योंकि अभिव्यक्ति ' (? i) foobar' '[एफएफ] [ओओ] {2} [बीबी] [एए] [आरआर]' – Thanatos

+0

से अधिक पठनीय है और क्योंकि यह _way_ अधिक बालों और जटिल हो सकता है। – Chop

6

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

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