Yang ini seharusnya sederhana, tapi membuatku bingung.

Saya memiliki Regex yang dapat memiliki kecocokan. Jika ya, saya ingin tahu di jalur apa. Apakah ada cara sederhana untuk melakukan ini mungkin dengan Linq tanpa mengulang setiap baris menghitung karakter?

  Regex rx = new Regex(myRegEx, RegexOptions.Compiled | RegexOptions.IgnoreCase);
  string[] docLines = File.ReadAllLines(myDocPath);
  // Find matches
  MatchCollection matches = rx.Matches(string.Join(Environment.NewLine, docLines));
  if(matches.Count > 0)
  {
    long loc = matches[0].Index;
    //Find the Line
  }
1
runfastman 5 Januari 2021, 02:46

3 jawaban

Jawaban Terbaik

Pelari cepat,

Anda dapat melakukan ini dengan menggunakan LINQ yang dikombinasikan dengan indeks seperti:

using System.Linq;
using System.Text.RegularExpressions;
   
var rx = new Regex(myRegEx, RegexOptions.Compiled | RegexOptions.IgnoreCase);
var docLines = File.ReadAllLines(myDocPath);
var matchLine = docLines.Select((line, index) => new { line, index }).FirstOrDefault(l => rx.IsMatch(l.line));
if(matchLine != null) Console.WriteLine($@"Match line # = {matchLine.index}");

Meskipun benar (seperti yang telah disebutkan orang lain) bahwa kompiler mengulangi baris untuk menyelesaikan tugas, saya merasakan bahwa di atas adalah apa yang ada dalam pikiran Anda.

EDIT

Mengingat komentar Anda bahwa string target dapat menjangkau beberapa baris, saya akan melakukan hal berikut:

var rx = new Regex(myRegEx, RegexOptions.Compiled | RegexOptions.IgnoreCase);
//Read all text into a variable.
var docLines = File.ReadAllText(myDocPath);
//Check that there is, in fact, a match.
if(!rx.IsMatch(docLines)) return;
//Split your text blob by that match.
var rxSplit = rx.Split(docLines);
//Then count the number of line brakes before the match.
var startOfMatchLine = new Regex(@"(\n|\r\n?)").Matches(rxSplit[0]).Count;
//And print the result.
Console.WriteLine($@"{startOfMatchLine}");
1
Jim Simson 5 Januari 2021, 15:57

Anda dapat mencocokkan baris demi baris:

  Regex rx = new Regex(myRegEx, RegexOptions.Compiled | RegexOptions.IgnoreCase);
  string[] docLines = File.ReadAllLines(myDocPath);
  // Find matches
  for(int x = 0; x < docLines.Length; x++){
    string line = docLines[x];
    if(rx.IsMatch(line))
      Console.Write($"Match on line {x}");
  }
1
Caius Jard 5 Januari 2021, 00:06

Anda dapat menemukan garis dengan menggunakan match.Value, misalnya:

Regex rx = new Regex("b", RegexOptions.Compiled | RegexOptions.IgnoreCase);
string[] docLines = new[] { "zzazz", "zzbzz", "zzczz", "zzzzz" };
// Find matches
MatchCollection matches = rx.Matches(string.Join(Environment.NewLine, docLines));
if (matches.Count > 0)
{
    string loc = matches[0].Value;
    //Find the Line
    var line = docLines.FirstOrDefault(x => x.Contains(loc));
}
-1
Nigrimmist 5 Januari 2021, 00:09