客客,这个何意 ((\d+)\d*)\2

plglenn20 2009-12-27 09:21:13
//正则实现
string str = "8912341253789";
Regex reg = new Regex(@"((\d+)\d*)\2");
while (str != (str = reg.Replace(str, "$1")))
{
}
...全文
105 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ekin0559 2009-12-27
  • 打赏
  • 举报
回复
复习一下。。。
-过客- 2009-12-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 plglenn21 的回复:]
\1?
[/Quote]

参考
正则基础之——反向引用
-过客- 2009-12-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lcl_data 的回复:]
我觉的写个函数处理方便一下,不过这贴要仔细学习
收藏
[/Quote]

LCL研究一下高效的算法吧,我因为工作不接触编程,只对正则感兴趣,所以不会花太多精力去研究这些了
十八道胡同 2009-12-27
  • 打赏
  • 举报
回复
我觉的写个函数处理方便一下,不过这贴要仔细学习
收藏
plglenn21 2009-12-27
  • 打赏
  • 举报
回复
\1
-过客- 2009-12-27
  • 打赏
  • 举报
回复
至于正则意义,按那帖楼主的需求,首先是要寻找重复数字,然后去掉后面的重复数字
这种需求用正则实现,就一定要用到反向引用

首先找到一个数字,然后再去找与它重复的数字
(\d)\d*?\1
那么要保留的是(\d)\d*?这一部分,所以要作为一个整体((\d)\d*?),这样反向引用的捕获组就要变成\2了
((\d)\d*?)\2
而替换后的结果就应为$1
reg.Replace(str, "$1")
但是由于正则一次匹配只能找到一个重复数字,所以只有通过程序来循环去重
while (str != (str = reg.Replace(str, "$1"))){}

由于正则中回溯次数与源字符串的长度有关,而程序循环的效率也与源字符串的长度有关,所以在源字符串很长的情况下,正则可以实现,但并不是合适的实现
amandag 2009-12-27
  • 打赏
  • 举报
回复
收藏
-过客- 2009-12-27
  • 打赏
  • 举报
回复
必须说明的一点,这种需求不适合用正则来实现,我只是为了研究一下,正则是否能实现,实现的效率如何才这样做的

见原帖
大家早上好,我想求一正则
这个通过测试证明是效率最低的写法了,用下面的方法测试,@"((\d+)\d*)\2",程序不响应,我也没等到执行时间

//改进一,去掉捕获组中的贪婪模式
StringBuilder sb = new StringBuilder(1024);
string str = "8912341253789";
for (int i = 0; i < 10000; i++)
{
sb.Append(str);
}
str = sb.ToString();
Stopwatch sw = new Stopwatch();
sw.Start();
Regex reg = new Regex(@"((\d)\d*)\2");
while (str != (str = reg.Replace(str, "$1"))) ;
sw.Stop();
richTextBox2.Text += "执行结果:" + str + "\n";
richTextBox2.Text += "执行时间:" + sw.ElapsedMilliseconds + " ms\n";
/*-------输出---------
执行结果:89123457
执行时间:90888 ms
*/


//改进二,把匹配重复数字中间字符串的模式改为非贪婪模式
StringBuilder sb = new StringBuilder(1024);
string str = "8912341253789";
for (int i = 0; i < 10000; i++)
{
sb.Append(str);
}
str = sb.ToString();
Stopwatch sw = new Stopwatch();
sw.Start();
Regex reg = new Regex(@"((\d)\d*?)\2");
while (str != (str = reg.Replace(str, "$1"))) ;
sw.Stop();
richTextBox2.Text += "执行结果:" + str + "\n";
richTextBox2.Text += "执行时间:" + sw.ElapsedMilliseconds + " ms\n";
/*--------输出----------
执行结果:89123457
执行时间:397 ms
*/


正则意义等下解释
wuyq11 2009-12-27
  • 打赏
  • 举报
回复
那个帖子已讲的很详细了

62,254

社区成员

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

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

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

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