string x = "Live for nothing nothing";
Regex r = new Regex(@"([a-z]+) \1");
([a-z]+)应该怎么理解?匹配a-z任意一个字符?
r的$1结果是什么?

解决方案 »

  1.   

    ([a-z]+)这个不难
    [a-z]+就是1个或1个以上小写字母
    ([a-z]+)就是1个或1个以上小写字母并分组用Match.Groups[1].Value可以取值。
      

  2.   

    string x = "Live for nothing nothing"; 
    Regex r = new Regex(@"([a-z]+) \1"); 
    ([a-z]+)应该怎么理解?匹配a-z任意一个字符? 
    r的$1结果是什么?\1 是哦 引用第一个括号里面的值
    比如是a 那么\1反向引用也就是a
    经常用来 显示重复的东东
      

  3.   

    ([a-z]+) \1问题的关键在于对\1的理解,\1是对第一个捕获组的反向引用,是在表达式匹配过程中对前面子表达式已匹配内容的引用
    这里的第一个捕获组就是([a-z]+),而它匹配的内容是一个或多个小写字母
    当第一个捕获组匹配完成时,\1的内容也就完全确定了([a-z]+)尝试匹配,因为是贪婪模式,所以会匹配到Live,那么此时空格后的\1的内容也必须是Live,整个表达式才能匹配成功,但这显然是不成立的,所以([a-z]+)会继续向后尝试匹配,直到它匹配到nothing,而空格后的也是nothing,这时整个表达式匹配成功,所以$1,也就是([a-z]+)匹配到的内容就是nothing反向引用用得比较多的地方是限定某一子表达式成对出现,比如
    <a href=(['"])[^'"]*\1[^>]*>
    这里的\1就表示,如果前面的是单引号,\1这个位置就一定要是单引号才能匹配成功,如果前面是双引号,\1这里同样必须是双引号才能匹配成功当然还有去除重复字符串等等应用,楼主自己体会下吧