比如说我有如下字符:col1
abc
abc
abc
abc
col2
abc
abc
abc
abc
col3
abc
abc
-----
查找abc的正则是:abc
但是这样的话会把所有abc都选出来如何才能做到查找
col2---col3之间的abc?
abc
abc
abc
abc
col2
abc
abc
abc
abc
col3
abc
abc
-----
查找abc的正则是:abc
但是这样的话会把所有abc都选出来如何才能做到查找
col2---col3之间的abc?
string content = File.ReadAllText("D:\\test.txt");
string result = Regex.Match(content, @"col2\s((\s*abc\s*)+)\scol3").Groups[1].Value;
Console.WriteLine(result.Trim());
{
m.Value;//是你要的
}//也可以简化的写为
foreach(Match m in Regex.Matches(yourStr,@"(?s)(?<=col2((?!col3).)*)abc"))
{
m.Value;//是你要的
}
解释下!
(?s)
单行模式(?<=col2((?!col3).)*)
匹配一个位置,这个位置前面需要是col2((?!col3).)*((?!col3).)*
(?!col3) 表示匹配一个位置,这个位置后面不是col3
((?!col3).) 表示后面不是col3这样一个位置上的任何一个字符
((?!col3).)* 这样的字符,0个或多个(?<=col2((?!col3).)*)
反过来看,这是一个位置,col2后面,跟着连续不是col3的任意字符多个。但col2....并不计入捕获abc捕获一个abc
想了一下,可以更快。这样简化foreach(Match m in Regex.Matches(yourStr,@"(?s)(?<=col2\s*|\G\s*)abc"))
{
m.Value;//是你要的
}(?s)(?<=col2\s*|\G\s*)abc
col2\s*后面,或上一个匹配点后\s*后的一个位置。这样位置的一个abc就是计入捕获。