2011-11-24 9 views
6

मैं "\ bpattern \ ख" इस सवाल का C#, Regex.Match whole wordsरेगेक्स अभिव्यक्ति पूरे शब्द से मेल खाने के लिए विशेष वर्णों के साथ काम नहीं कर रही है?

यह मैच पूरे शब्द के लिए कहते हैं के माध्यम से जा रहा था का उपयोग यह कोई विशेष वर्ण के बाद से यह शब्द पात्रों केवल के लिए है बिना मैच पूरे शब्द के लिए ठीक काम करता है!

मुझे विशेष पात्रों के साथ शब्दों से मेल खाने के लिए एक अभिव्यक्ति की आवश्यकता है। मेरा कोड निम्नानुसार है

class Program 
{ 
    static void Main(string[] args) 
    { 
     string str = Regex.Escape("Hi temp% dkfsfdf hi"); 
     string pattern = Regex.Escape("temp%"); 
     var matches = Regex.Matches(str, "\\b" + pattern + "\\b" , RegexOptions.IgnoreCase); 
     int count = matches.Count; 
    } 
} 

लेकिन यह% की वजह से विफल रहता है। क्या इसके लिए हमारे पास कोई कामकाज है? 'अंतरिक्ष', '(', ')', आदि

उत्तर

3

की तरह अन्य विशेष वर्ण नहीं हो सकता है पैटर्न, अक्षर हैं जो Regex के लिए विशेष होते हैं Regex.Escape पहले के माध्यम से चला सकते हैं तो।

आपने ऐसा किया, लेकिन उस स्ट्रिंग से बचें जिसे आप खोजते हैं - आपको इसकी आवश्यकता नहीं है।

+0

सच है, लेकिन उसकी समस्या के लिए (केवल) कारण नहीं है। –

5

यदि आपके पास गैर-शब्द वर्ण हैं तो आप \b का उपयोग नहीं कर सकते हैं। आप उपयोग कर सकते हैं निम्नलिखित

@"(?<=^|\s)" + pattern + @"(?=\s|$)" 

संपादित: टिम टिप्पणी में उल्लेख किया है, अपने रेगुलर एक्सप्रेशन से ठीक विफल हो रहा है तो उसके आगे क्योंकि \b% और सफेद अंतरिक्ष के बीच की सीमा से मिलान करने में विफल रहता है क्योंकि उन दोनों को गैर हैं शब्द अक्षर \b केवल शब्द चरित्र और एक गैर-शब्द चरित्र के बीच की सीमा से मेल खाता है।

शब्द सीमाओं here पर और देखें।

स्पष्टीकरण

@" 
(?<=  # Assert that the regex below can be matched, with the match ending at this position (positive lookbehind) 
       # Match either the regular expression below (attempting the next alternative only if this one fails) 
    ^   # Assert position at the beginning of the string 
    |   # Or match regular expression number 2 below (the entire group fails if this one fails to match) 
     \s   # Match a single character that is a “whitespace character” (spaces, tabs, and line breaks) 
) 
temp%  # Match the characters “temp%” literally 
(?=   # Assert that the regex below can be matched, starting at this position (positive lookahead) 
       # Match either the regular expression below (attempting the next alternative only if this one fails) 
     \s   # Match a single character that is a “whitespace character” (spaces, tabs, and line breaks) 
    |   # Or match regular expression number 2 below (the entire group fails if this one fails to match) 
     $   # Assert position at the end of the string (or before the line break at the end of the string, if any) 
) 
" 
+1

अधिक सटीक, यदि आपके पास गैर-अल्फान्यूमेरिक वर्ण आपके खोज शब्द की शुरुआत या अंत हैं, तो आप '\ b' का उपयोग नहीं कर सकते हैं क्योंकि एंकर एक एलनम चरित्र और गैर-एलनम चरित्र के बीच मेल खाता है। –

+0

@Yadala - बस शानदार! इसके अलावा लगभग एक समस्या है। मान लें कि स्ट्रिंग "हाय यह स्टैक ओवरफ्लो है" और पैटर्न "यह" है, फिर यह कोई मिलान नहीं कहता है। पैटर्न में वास्तविक स्ट्रिंग के बाद यह रिक्त स्थान की वजह से होता है। हम इसे कैसे संभालेंगे? आदर्श रूप से यह कहना चाहिए कि एक मैच मिला! – GuruC

+0

@GuruC यदि आपके पास अपनी खोज स्ट्रिंग में श्वेत-स्थान है, तो यह अभी भी पूरी शब्द खोज कैसे हो सकता है? मैंने इसे नोटपैड ++ में अभी सत्यापित किया है, अगर मैं पूरी शब्द खोज का चयन करता हूं और "हाय" में "यह" स्टैक ओवरफ्लो "में खोज करता हूं .. यह कोई मैचों नहीं देता है। –

1
output = Regex.Replace(output, "(?<!\w)-\w+", "") 
output = Regex.Replace(output, " -"".*?""", "") 
संबंधित मुद्दे

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