मैं रेगेक्स के साथ एक पूरे स्ट्रिंग का मिलान कैसे करूं?


82

मुझे एक regex की आवश्यकता है जो केवल उन मिलानों को खोजेगा जहां पूरे स्ट्रिंग मेरी क्वेरी से मेल खाते हैं।

उदाहरण के लिए यदि मैं "रेड अक्टूबर" नाम वाली फिल्मों की खोज करता हूं तो मैं केवल उस सटीक शीर्षक (केस असंवेदनशील) पर मिलान करना चाहता हूं लेकिन "द हंट फॉर रेड अक्टूबर" जैसे शीर्षक से मेल नहीं खाता। निश्चित रूप से मुझे नहीं पता कि मुझे यह कैसे करना है। किसी को पता है?

धन्यवाद!


1
आपको किसी चीज़ के लिए रेगेक्स की आवश्यकता क्यों है जो एक साधारण string.Containsकाम करेगा?
Oded

1
रीजेक्स का उपयोग करने का कारण यह है कि मैं इसे मोंगोबीडी में खोज के लिए उपयोग कर रहा हूं और मुझे इसे असंवेदनशील होने की आवश्यकता है जो केवल एक रेगेक्स के साथ किया जा सकता है
मीका

खोज के लिए लोअरकेस और यूज़र लोअर केस स्ट्रिंग में डेटा (ऑन-फ्लाई) डीबी डेटा में क्यों नहीं परिवर्तित किया जाता है?
ग्रीनोल्डमैन

1
@ मैंस असहमत नहीं हूं कि यह एक बेहतर विकल्प होगा, लेकिन दुर्भाग्य से मेरी मौजूदा स्थिति इसकी अनुमति नहीं देती है।
मीका

FYI करें, अगर आपको regex का उपयोग करने की आवश्यकता नहीं है, तो बस मामले की अनदेखी करने वाले दो तारों की तुलना करने की कोशिश कर रहा है, बस कर सकते हैंstring1.Equals(string2, StringComparison.OrdinalIgnoreCase);
ToolmakerSteve

जवाबों:


111

निम्नलिखित नियमित अभिव्यक्ति का प्रयास करें:

^Red October$

डिफ़ॉल्ट रूप से, नियमित अभिव्यक्तियाँ केस संवेदी होती हैं। ^निशान मिलान पाठ और के शुरू $अंत।


1
FYI करें, उल्लेखनीय है कि इसे केस असंवेदनशील बनाने के लिए, जब रेगेक्स ऑब्जेक्ट बनाते हैं, तो दूसरा पैरामीटर RegexOptions.IgnoreCase जोड़ें।
टूलमेकरसेव

यह काम करने में विफल रहता है अगर उस स्ट्रिंग के आसपास कुछ और है। उदाहरण के लिए यदि आप स्ट्रीट के रूप में "सेंट" की खोज कर रहे थे, लेकिन आपके पास उसी लाइन पर अन्य तार हैं जो "सेंट" से भी शुरू होते हैं जैसे कि "स्टर्लिंग" नाम यह रेगेक्स सटीक मिलान नहीं करेगा। मुझे यकीन नहीं है कि RegEx दुर्भाग्य से इस परिदृश्य के लिए सही उत्तर है। मैं हालांकि कोशिश जारी रखने जा रहा हूं। नीचे टिम का जवाब अच्छा है, लेकिन सभी इंजन इसका समर्थन नहीं करते हैं।
डिस्लेक्सिकानबोको

वास्तव में, $हमेशा स्ट्रिंग के अंत से मेल नहीं खाता, \zकरता है ( \Zपायथन में समतुल्य है)। कृपया टिम पीटरज़कर का जवाब देखें । हालांकि यह जावास्क्रिप्ट के लिए सही है।
विकटोरिया स्ट्रिबिएव

42

आम तौर पर, और डिफ़ॉल्ट सेटिंग्स के साथ, ^और $एंकर यह सुनिश्चित करने का एक अच्छा तरीका है कि एक रेगेक्स पूरे स्ट्रिंग से मेल खाता है।

कुछ चेतावनी, हालांकि:

यदि आपके पास अपने रेगेक्स में प्रत्यावर्तन है, तो अपने रेगेक्स को गैर-कैप्चरिंग समूह में संलग्न करें ^और उसके साथ आस-पास से पहले $:

^foo|bar$

से अलग है

^(?:foo|bar)$

इसके अलावा, ^और $एक अलग अर्थ (के अंत शुरू / ले जा सकते हैं लाइन के प्रारंभ / समाप्ति के बजाय स्ट्रिंग ) कुछ विकल्प सेट हैं। पाठ संपादकों में जो नियमित अभिव्यक्ति का समर्थन करते हैं, यह आमतौर पर डिफ़ॉल्ट व्यवहार होता है। कुछ भाषाओं में, विशेष रूप से रूबी, इस व्यवहार को भी बंद नहीं किया जा सकता है।

इसलिए एंकर का एक और सेट है जो केवल पूरे स्ट्रिंग के प्रारंभ / अंत में मैच करने की गारंटी देता है:

\A स्ट्रिंग की शुरुआत में मेल खाता है।

\Z स्ट्रिंग के अंत में या अंतिम पंक्ति विराम से पहले मेल खाता है।

\z स्ट्रिंग के बहुत अंत में मेल खाता है।

लेकिन सभी भाषाएं इन एंकरों का समर्थन नहीं करती हैं, विशेष रूप से जावास्क्रिप्ट।


4
यह सबसे उपयोगी उत्तर है
जेरेमी डैनियो

18

का प्रयोग करें ^और $निरूपित करने के लिए जहां regex पैटर्न प्रारंभ और स्ट्रिंग के अंत के सापेक्ष बैठता संशोधक:

Regex.Match("Red October", "^Red October$"); // pass
Regex.Match("The Hunt for Red October", "^Red October$"); // fail

10

मुझे पता है कि इसका जवाब देने में थोड़ी देर हो सकती है, लेकिन शायद यह किसी और के लिए काम आएगा।

सबसे सरल तरीका:

var someString = "...";
var someRegex = "...";
var match = Regex.Match(someString , someRegex );
if(match.Success && match.Value.Length == someString.Length){
    //pass
} else {
    //fail
}

2
IMHO यह स्वीकृत उत्तर की तुलना में कम सरल है। लेकिन यह एक विकल्प है।
टूलमेकरसैट

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

8

आपको अपना रीगेक्स ^(स्ट्रिंग की शुरुआत) और $(स्ट्रिंग का अंत ) संलग्न करना होगा :

^Red October$

0

क्षमा करें, लेकिन यह थोड़ा अस्पष्ट है।

मैंने जो पढ़ा है, उससे आप सरल स्ट्रिंग तुलना करना चाहते हैं। उसके लिए आपको regex की आवश्यकता नहीं है।

string myTest = "Red October";
bool isMatch = (myTest.ToLower() == "Red October".ToLower());
Console.WriteLine(isMatch);
isMatch = (myTest.ToLower() == "The Hunt for Red October".ToLower());

1
रीजेक्स का उपयोग करने का कारण यह है कि मैं इसे MongoDB में खोज के लिए उपयोग कर रहा हूं और मुझे यह करने की आवश्यकता है कि असंवेदनशील विच केवल एक रेगेक्स के साथ किया जा सकता है।
मीका

-1

आप इसे इस छूट की तरह कर सकते हैं यदि मैं केवल एक बार पत्र को एक स्ट्रिंग में एक बार में पकड़ना चाहता हूं और इसे myRegex.IsMatch () के साथ जांच सकता हूं

^ [^ ई] [ई] {1} [^ ई] $

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