C# 获取匹配图案的行号

C# 获取匹配图案的行号,c#,regex,C#,Regex,我使用这段代码检查我加载到内存中的文本文件中是否存在字符串 foreach (Match m in Regex.Matches(haystack, needle)) richTextBox1.Text += "\nFound @ " + m.Index; 正则表达式返回匹配发生的位置,但我希望 要知道行号?您可以先将文本分成几行,然后将正则表达式应用于每一行-当然,如果指针包含新行,则这不起作用: var lines = haystack.Split(new[] { Environme

我使用这段代码检查我加载到内存中的文本文件中是否存在字符串

foreach (Match m in Regex.Matches(haystack, needle))
    richTextBox1.Text += "\nFound @ " + m.Index;
正则表达式返回匹配发生的位置,但我希望
要知道行号?

您可以先将文本分成几行,然后将正则表达式应用于每一行-当然,如果
指针
包含新行,则这不起作用:

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)
}
var lines=haystack.Split(new[]{Environment.NewLine},StringSplitOptions.None);

对于(int i=0;i而言,最好的解决方案是调用一个方法,该方法仅在匹配发生时获取行号。 这样,如果检查了多个文件,并且带有
\n
的regexp将正常工作,则性能不会受到太大影响。在stackoverflow上的某个位置找到此方法:

    public int LineFromPos(string input, int indexPosition)
    {
        int lineNumber = 1;
        for (int i = 0; i < indexPosition; i++)
        {
            if (input[i] == '\n') lineNumber++;
        }
        return lineNumber;
    }
public int-LineFromPos(字符串输入,int-indexPosition)
{
int lineNumber=1;
for(int i=0;i
为此,我执行了以下操作

  • 将文件内容读入缓冲区
  • 使用正则表达式匹配文件中的所有回车,并注意回车列表中有索引

    private static List<CarriageReturn> _GetCarriageReturns( string data )
    {
        var carriageReturns = new List<CarriageReturn>();
    
        var carriageReturnRegex = new Regex( @"(?:([\n]+?))", RegexOptions.IgnoreCase | RegexOptions.Singleline );
        var carriageReturnMatches = carriageReturnRegex.Matches( data );
        if( carriageReturnMatches.Count > 0 )
        {
            carriageReturns.AddRange( carriageReturnMatches.Cast<Match>().Select( match => new CarriageReturn
            {
                Index = match.Groups[1].Index,
            } ).ToList() );
        }
    
        return carriageReturns;
    }
    
    private static List\u getcarriers(字符串数据)
    {
    var=newlist();
    var carinereturnregex=newregex(@“(?:([\n]+?)”,RegexOptions.IgnoreCase | RegexOptions.Singleline);
    var carinereturnmatches=carinereturnregex.Matches(数据);
    如果(匹配。计数>0)
    {
    careerReturns.AddRange(careerReturnMatches.Cast()。选择(匹配=>new CareerReturn
    {
    索引=匹配。组[1]。索引,
    })。ToList());
    }
    返回车厢返回;
    }
    
  • 在文件中使用我的正则表达式,并对每个匹配项执行类似以下操作
    LineNumber=careerrurns.Count(ret=>ret.Index


因此,基本上我计算了比赛前发生的回车次数,并加上1,我认为更具吸引力的选择是在草堆中使用
StringReader
,然后使用
ReadLine()
读取行而不是以这种方式拆分行。true-我假设haystack
已经加载到内存中,如果没有,则对于较长的文件,绝对首选
File.ReadLines()
    public int LineFromPos(string input, int indexPosition)
    {
        int lineNumber = 1;
        for (int i = 0; i < indexPosition; i++)
        {
            if (input[i] == '\n') lineNumber++;
        }
        return lineNumber;
    }
private static List<CarriageReturn> _GetCarriageReturns( string data )
{
    var carriageReturns = new List<CarriageReturn>();

    var carriageReturnRegex = new Regex( @"(?:([\n]+?))", RegexOptions.IgnoreCase | RegexOptions.Singleline );
    var carriageReturnMatches = carriageReturnRegex.Matches( data );
    if( carriageReturnMatches.Count > 0 )
    {
        carriageReturns.AddRange( carriageReturnMatches.Cast<Match>().Select( match => new CarriageReturn
        {
            Index = match.Groups[1].Index,
        } ).ToList() );
    }

    return carriageReturns;
}