获取匹配模式的行号

Nen*_*nad 6 c# regex

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

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

正则表达式返回匹配发生的位置,但我想知道行号?

Bro*_*ass 6

您可以先将文本拆分为行,然后将RegEx应用于每一行 - 当然,如果needle包含NewLine,则无效:

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)
}
Run Code Online (Sandbox Code Playgroud)


Nen*_*nad 6

最好的解决方案是调用仅在匹配发生时获取行号的方法.这样,如果检查了多个文件并且regexp with \n将起作用,则性能不会受到太大影响.在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;
    }
Run Code Online (Sandbox Code Playgroud)