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;
}