2011-12-11 16 views
6

मैं जाँच करने के लिए इस कोड का उपयोग करता है, तो एक स्ट्रिंग एक पाठ फ़ाइल है कि मैं स्मृतिका मिलान नहीं हुआ पैटर्न

foreach (Match m in Regex.Matches(haystack, needle)) 
    richTextBox1.Text += "\nFound @ " + m.Index; 

regex पदों जहां एक मैच हुआ रिटर्न लेकिन मैं चाहते हैं में लोड में मौजूद के लिए लाइन नंबर प्राप्त करें लाइन नंबर पता है?

var lines = haystack.Split(new[] { Environment.NewLine }, StringSplitOptions.None); 
for(int i=0; i <lines.Length; i++) 
{ 
    foreach (Match m in Regex.Matches(lines[i], needle)) 
     richTextBox1.Text += string.Format("\nFound @ line {0}", i+1) 
} 

उत्तर

5
सबसे अच्छा

समाधान एक विधि को कॉल करना होगा जो केवल एक पंक्ति होने पर लाइन नंबर प्राप्त करता है। इस तरह से प्रदर्शन बहुत अधिक प्रभावित नहीं होता है यदि एकाधिक फ़ाइलों की जांच की गई थी और \n के साथ regexp काम करेगा। इस विधि कहीं मिले stackoverflow पर:

public int LineFromPos(string S, int Pos) 
    { 
     int Res = 1; 
     for (int i = 0; i <= Pos - 1; i++) 
      if (S[i] == '\n') Res++; 
     return Res; 
    } 
5

आप पहली बार लाइनों में अपने पाठ विभाजित है और प्रत्येक पंक्ति के लिए अपने रेगुलर एक्सप्रेशन से आवेदन कर सकते हैं निश्चित रूप से है कि अगर needle काम नहीं करता है एक नई पंक्ति में शामिल है सुई एक रेखा पार करती है, लेकिन ऐसा इसलिए है क्योंकि रेगेक्स इसे पहचान नहीं पाता है।

संपादित हो सकता है आप रिक्त स्थान के साथ पाठ में endlines की जगह और वहाँ regex लागू कर सकते हैं, इस कोड को अभी भी काम करेगा और अगर सुई एक लाइन पर गिर जाता है यह अभी भी पाया जा होगा:

Regex.Matches(haystack.Replace(Environment.NewLine, " "), needle) 
+0

मुझे लगता है कि एक बहुत अधिक आकर्षक विकल्प भूसे के ढेर के लिए एक 'StringReader' का उपयोग करें और उपयोग करने के लिए किया जाएगा' ReadLine() 'इसे उस तरह से बंटवारे के बजाय लाइनों को पढ़ने के लिए। –

+0

सच - मैंने माना था कि 'हैस्टैक' पहले ही मेमोरी में लोड हो चुका है, अगर ऐसा नहीं है, तो लंबी फाइलों के लिए बिल्कुल' फाइल। रीडलाइन() 'को प्राथमिकता दी जाएगी – BrokenGlass

0
foreach (Match m in Regex.Matches(haystack, needle)) 
    { 
     int startLine = 1, endLine = 1; 
     // You could make it to return false if this fails. 
     // But lets assume the index is within text bounds. 
     if (m.Index < haystack.Length) 
     { 
      for (int i = 0; i <= m.Index; i++) 
       if (Environment.NewLine.Equals(haystack[i])) 
        startLine++; 
      endLine = startLine; 

      for (int i = m.Index; i <= (m.Index + needle.Length); i++) 
       if (Environment.NewLine.Equals(haystack[i])) 
        endLine++; 
     } 

     richTextBox1.Text += string.Format(
"\nFound @ {0} Line {1} to {2}", m.Index, startLine, endLine); 

वास्तव में अगर काम नहीं करेगा: -

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