日期:2014-05-17  浏览次数:20543 次

求解释个正则表达式
在看过客的正则笔记。有些不懂,请大家帮忙解释下。谢谢

C# code


需求1:验证字符串中任意位置出现的连续四个数字在整个字符串中是否有重复,有重复为True,无重复为False。
string[] test = new string[] { "1985aaa1985bb", "bcae1958fiefadf1955fef", "atijc1944cvkd", "df2564isdjfef2564d", "abc1234def5678ghi5678jkl" };

Regex reg = new Regex(@"(\d{4})(?:(?!\1).)*\1");

foreach (string s in test)

{

      richTextBox2.Text += "源字符串:  " + s.PadRight(25, ' ') + "验证结果:  " + reg.IsMatch(s) + "\n";

}

/*--------输出--------

源字符串:  1985aaa1985bb            验证结果:  True

源字符串:  bcae1958fiefadf1955fef   验证结果:  False

源字符串:  atijc1944cvkd            验证结果:  False

源字符串:  df2564isdjfef2564d       验证结果:  True

源字符串:  abc1234def5678ghi5678jkl 验证结果:  True

*/
需求1  Regex reg = new Regex(@"(\d{4})(?:(?!\1).)*\1");
我的理解:(\d{4})4个连续的数字。(?:(?!\1).)*\1") 非捕获组 和顺序否定环视,作用就是取4个连续数字 后面的字符

\1则是反向引用,目的是取 相同的4个数字

不知道说的 对不对。。。



我的问题是,需求2:验证字符串中第一个出现的连续4个数字是否有重复,有重复为True,无重复为False。
C# code

Regex reg = new Regex(@"^(?:(?!\d{4}).)*(\d{4})(?:(?!\1).)*\1");


这条正则 不知道怎么理解


------解决方案--------------------
^(?:(?!\d{4}).)*
就是以非连续4个数字开头的任意字符,匹配0或多次,即允许连续四位数字前出现其他字符
------解决方案--------------------
探讨
C# code

两个正则的区别

第一种:Regex reg = new Regex(@"(\d{4})(?:(?!\1).)*\1");
源字符串: abc1234def5678ghi5678jkl 验证结果: True

第二种: Regex reg = new Regex(@"^(?:(?!\d{4}).)*(\d{4})(?:(?!\1).)*\1");
源字符串: ……