日期:2014-05-18  浏览次数:20878 次

请教一下这个正则表达式
static void Main(string[] args)
  {
  string pattern = @"((.*)小李(.*))|((.*)小张(.*))";
  string input = "我借了小李一本书";
  Match match = Regex.Match(input, pattern);
  Console.WriteLine(match.Groups[1].Value);
  Console.WriteLine(match.Groups[2].Value);
  Console.ReadKey();
  }

上面的输出结果为:
我借了小李一本书
我借了

我的问题:
正则表达式只有2个分组吧,是以"|"作为分隔符的,这点没错吧?
既然是2个分组,那第二个分组,也就是((.*)小张(.*)),这个应该没有匹配项啊,因此,match.Groups[2].Value的值就应该为空啊,结果怎么会输出“我借了”呢?

------解决方案--------------------
不对,你理解的不对,| 是或者的话,匹配它前面的或者后面的,前后的分组不干扰,所以

((.*)小李(.*)),第一个分组是全部内容,第二个是前面的(.*),第三个是后面的(.*),因为没有 “小张”,所以后面那个没有匹配结果,如果有的话,就和小李这个一样,如果你用MatchCollection去匹配,会有两个匹配,不是你理解的后面的要占用前面的分组
------解决方案--------------------
你的理解有错误

string pattern = "(.*)小[李张](.*)";
如上所示:
第一个 (.*) 就是Group[1]
第二个 (.*) 就是Group[2]
------解决方案--------------------
较为详细的参考资料:http://blog.csdn.net/lxcnn/article/details/4146148
------解决方案--------------------
在((.*)小李(.*))|((.*)小张(.*))中,组号分别是

(1(2.*)小李(3.*))|(4([color=#FF0000][/color]5.*)小张(6.*))
------解决方案--------------------
(1(2.*)小李(3.*))|(4(5.*)小张(6.*))
------解决方案--------------------
探讨
static void Main(string[] args)
{
string pattern = @"((.*)小李(.*))|((.*)小张(.*))";
string input = "我借了小李一本书";
Match match = Regex.Match(input, pattern);
……