2010-10-01 7 views
6

बार-बार उपसर्ग पैटर्न के मैचों को छोड़ने के लिए मैं सी # रेगेक्स में दिखने का उपयोग कैसे कर सकता हूं?बार-बार उपसर्ग पैटर्न के मैचों को छोड़ने के लिए मैं सी # रेगेक्स में दिखने का उपयोग कैसे कर सकता हूं?

उदाहरण - मैं अभिव्यक्ति मैच सब ba वर्णों की संख्या निम्न वर्णों के लिए कोशिश कर रहा हूँ:

Regex expression = new Regex("(?<=a).*"); 

foreach (Match result in expression.Matches("aaabbbb")) 
    MessageBox.Show(result.Value); 

रिटर्न aabbbb, lookbehind केवल एक a मिलान। मैं इसे कैसे बना सकता हूं ताकि यह शुरुआत में सभी a एस से मेल खा सके?

मैं

Regex expression = new Regex("(?<=a+).*"); 

और

Regex expression = new Regex("(?<=a)+.*"); 

बिना किसी परिणाम के ...

bbbb क्या मैं उम्मीद कर रहा हूँ है की कोशिश की है।

+0

आपका निष्कासित परिणाम क्या है? – splash

उत्तर

6

आप के लिए देख रहे एक दोहराया कब्जा समूह?

(.)\1* 

यह दो मैचों में वापस आ जाएगा।

को देखते हुए:

aaa 
bbbb 

यह:

aaabbbb 

इस का परिणाम देगा

(?<=(.))(?!\1).* 

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

से मेल खाता है कि:

bbbb 
+0

मुझे सभी वर्णों से मेल खाने के लिए समूह को देखने की ज़रूरत है। यही है, वास्तविक मिलान बीबीबीबी है, क्योंकि दोहराए गए समूह को अनदेखा किया जाना चाहिए। – luvieere

+0

@luvieere: मैंने यह परिवर्तन किया है। –

1

"पीछे" छोड़ने का कारण यह है कि यह पहले "ए" (लेकिन इसे कैप्चर नहीं कर रहा है) का उपभोग कर रहा है, फिर यह बाकी को कैप्चर करता है।

क्या यह पैटर्न आपके लिए काम करेगा? नया पैटर्न: \ba+(.+)\b यह शब्द के किसी भी छोर को एंकर करने के लिए एक शब्द सीमा \b का उपयोग करता है। यह कम से कम एक "ए" से मेल खाता है जब तक शब्द सीमा समाप्त नहीं हो जाती है। शेष वर्ण समूह में कब्जा कर लिया जाता है ताकि आप उन्हें आसानी से संदर्भित कर सकें।

string pattern = @"\ba+(.+)\b"; 

foreach (Match m in Regex.Matches("aaabbbb", pattern)) 
{ 
    Console.WriteLine("Match: " + m.Value); 
    Console.WriteLine("Group capture: " + m.Groups[1].Value); 
} 

अद्यतन: आप किसी भी दोहराया पत्र की पहली आवृत्ति को छोड़ने के लिए है, तो स्ट्रिंग के बाकी से मेल चाहते हैं, आप ऐसा कर सकता है:

string pattern = @"\b(.)(\1)*(?<Content>.+)\b"; 

foreach (Match m in Regex.Matches("aaabbbb", pattern)) 
{ 
    Console.WriteLine("Match: " + m.Value); 
    Console.WriteLine("Group capture: " + m.Groups["Content"].Value); 
} 
+0

इसे अपने रेगेक्स में 'बी' या 'ए' के ​​बिना करें। –

+0

@ जॉन धन्यवाद मुझे विशेष रूप से "ए" पत्र पर ठीक किया गया था। मेरा दूसरा नमूना किसी भी डुप्लिकेट चरित्र के साथ काम करता है और बिना हार्डकोडिंग के। –

+0

ठीक है, +1, मैं तर्क दूंगा कि मेरा थोड़ा और संक्षिप्त है, लेकिन ऐसा लगता है कि इसे पढ़ना आसान है। –

3

मैं यह अंततः लगा आउट:

Regex expression = new Regex("(?<=a+)[^a]+"); 

foreach (Match result in expression.Matches(@"aaabbbb")) 
    MessageBox.Show(result.Value); 

मैं गैर lookbehind समूह से मिलान मेरे लिए a रों की अनुमति नहीं होना चाहिए। इस तरह, अभिव्यक्ति केवल उन b पुनरावृत्ति से मेल खाती है जो a पुनरावृत्ति का पालन करती हैं।

aaabbbb पैदावार bbbb मिलान और bbbbcccbbbb, bbzz और bbb में मिलान aaabbbbcccbbbbaaaaaabbzzabbb का परिणाम है।

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

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