求解释个正则表达式

yksyuan 2012-05-04 03:07:27
在看过客的正则笔记。有些不懂,请大家帮忙解释下。谢谢



需求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。

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


这条正则 不知道怎么理解
...全文
117 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
yksyuan 2012-05-04
  • 打赏
  • 举报
回复


恩,大概理解了。。。。

谢谢huangwenquan123和bdmh的帮助。。
万分感谢。结贴了
yksyuan 2012-05-04
  • 打赏
  • 举报
回复
恩,我先消化下。。。谢谢 两位。。。。
huangwenquan123 2012-05-04
  • 打赏
  • 举报
回复
你把Regex reg = new Regex(@"^(?:(?!\d{4}).)*(\d{4})(?:(?!\1).)*\1");
中的^去掉
Regex reg = new Regex(@"(?:(?!\d{4}).)*(\d{4})(?:(?!\1).)*\1");
当匹配到1234时匹配失败会进行回朔,继续匹配到5678,最终为true
huangwenquan123 2012-05-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
C# code

两个正则的区别

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

第二种: Regex reg = new Regex(@"^(?:(?!\d{4}).)*(\d{4})(?:(?!\1).)*\1");
源字符串: ……
[/Quote]喔,lz是在疑问这两句?
第一句lz没问题吧?
至于第二句因为是从开头开始匹配,匹配不是数字的任意其他数
而当遇到1234的时候匹配结束,(\d{4})捕获的是1234,
而\1的结果也是1234.所以会导致失败.
而在第一句的正择(\d{4})(?:(?!\1).)*\1
\d{4}捕获1234,(?:(?!\1).)*\1进行匹配,一直匹配到结束都没有匹配到\1
正择引擎会向右驱动,匹配到5678,\1也可以匹配到....5678jkl中jkl前面的5678
yksyuan 2012-05-04
  • 打赏
  • 举报
回复


我是不理解 第二条正则中,

^(?:(?!\d{4}).)*

这句话的意思。所以 来询问下。。。。

huangwenquan123 2012-05-04
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
引用 5 楼 的回复:
^(?:(?!\d{4}).)*
就是以非连续4个数字开头的任意字符,匹配0或多次,即允许连续四位数字前出现其他字符

可是 bdmh 我执行 过客的 第二个正则,是匹配成功的。所以 我才奇怪。


C# code

string[] test = new string[] { "1985aaa1985bb", "bcae1958fiefadf1955fe……
[/Quote]匹配成功有什么问题吗?
yksyuan 2012-05-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
^(?:(?!\d{4}).)*
就是以非连续4个数字开头的任意字符,匹配0或多次,即允许连续四位数字前出现其他字符
[/Quote]
可是 bdmh 我执行 过客的 第二个正则,是匹配成功的。所以 我才奇怪。


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

你看 这个字符串1985aaa1985bb 也是 4个数字开头,可是验证结果为True。证明他匹配成功了

抓狂了

bdmh 2012-05-04
  • 打赏
  • 举报
回复
^(?:(?!\d{4}).)*
就是以非连续4个数字开头的任意字符,匹配0或多次,即允许连续四位数字前出现其他字符
yksyuan 2012-05-04
  • 打赏
  • 举报
回复

两个正则的区别

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

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

第二种的 ^(?:(?!\d{4}).)*
这句话 我不理解
yksyuan 2012-05-04
  • 打赏
  • 举报
回复
bdmh不是的。。。
需求2:验证字符串中第一个出现的连续4个数字是否有重复,有重复为True,无重复为False
========================================================================
第二种 是匹配 第一次出现的 连续4个数字。。。

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


bdmh 2012-05-04
  • 打赏
  • 举报
回复
第二种可以匹配这样的
开头是非数字的
h1985aaa1985bb

而第一种不行
yksyuan 2012-05-04
  • 打赏
  • 举报
回复
后面的正则都一样,需求2 比需求1 只多了 这条

^(?:(?!\d{4}).)*

^不是开始的意思么,我想了下 没法理解。。大家帮我下。谢谢

62,072

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧