比如说我有如下字符:col1
abc
abc
abc
abc
col2
abc
abc
abc
abc
col3
abc
abc
-----
查找abc的正则是:abc
但是这样的话会把所有abc都选出来如何才能做到查找
col2---col3之间的abc?

解决方案 »

  1.   


                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());
      

  2.   

    在等到的结果再Split一下不就可以了吗……
      

  3.   

    foreach(Match m in Regex.Matches(yourStr,@"(?s)(?<=col2((?!col3).)*)abc(?=((?!\bcol\d+\b).)*?col3)"))
    {
        m.Value;//是你要的
    }//也可以简化的写为
    foreach(Match m in Regex.Matches(yourStr,@"(?s)(?<=col2((?!col3).)*)abc"))
    {
        m.Value;//是你要的
    }
      

  4.   

    (?s)(?<=col2((?!col3).)*)abc
    解释下!
      

  5.   


    (?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就是计入捕获。