关于正则表达式的死循环问题

k39k39 2010-12-01 02:48:18
我要用一个正则表达式同时匹配如下内容,正则用 VBScript_RegExp_55_TLB 或perl

1、<div id="123">

2、<div id="123" class="xxx">

我这样写

<div id="123"([\s\S]*?)>

是可以取到子匹配 分别为空 和 class="xxx" ,注意,这里我是要子匹配能取到空值。

但是但在某些时候测试时,会发生死循环。


关于正则的说明有这样一段话

能匹配空字符串的子匹配不要循环无限次。如果括号内的子表达式中的每一部分都可以匹配 0 次,而这个括号整体又可以匹配无限次,匹配过程中可能死循环。虽然现在有些正则表达式引擎已经通过办法避免了这种情况出现死循环了,比如 .NET 的正则表达式,但是我们仍然应该尽量避免出现这种情况。如果我们在写表达式时遇到了死循环,也可以从这一点入手。


死循环应该与此有关,请问,要达到我的目的,该怎么写这个正则?

...全文
867 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
k39k39 2011-01-03
  • 打赏
  • 举报
回复
现在没有把帖子提前的功能了,人工顶吧
k39k39 2010-12-31
  • 打赏
  • 举报
回复
现在就是需要一个通用的匹配任意字符串(允许结果为空),或者大家有没有防死循环的正则库,据说ASP.NET的正则可以避免,想找个DELPHI7能用的。
兔子-顾问 2010-12-18
  • 打赏
  • 举报
回复
死循环,应该是无限回溯,减少无限回溯的最好办法就是用较小的范围来匹配,尽量正则描述的精确一些,或是加一些容易导致失配的关键点。
k39k39 2010-12-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 s11ss 的回复:]
一般是.*?吧,但用类似[^>]的形式的正则效率更高一些,应当也能避免“死循环”,确实不通用,得具体情况具体分析

[/Quote]

用.的话,少了匹配换行,另外,因为是要获得这个字匹配的值,所以要用括号,但用括号按前面的说法,就可能出死循环问题。
s11ss 2010-12-10
  • 打赏
  • 举报
回复
不如举个死循环的实际例子来研究下?
[Quote=引用 5 楼 k39k39 的回复:]
引用 3 楼 s11ss 的回复:
一般是.*?吧,但用类似[^>]的形式的正则效率更高一些,应当也能避免“死循环”,确实不通用,得具体情况具体分析



用.的话,少了匹配换行,另外,因为是要获得这个字匹配的值,所以要用括号,但用括号按前面的说法,就可能出死循环问题。
[/Quote]
s11ss 2010-12-09
  • 打赏
  • 举报
回复
一般是.*?吧,但用类似[^>]的形式的正则效率更高一些,应当也能避免“死循环”,确实不通用,得具体情况具体分析[Quote=引用 2 楼 k39k39 的回复:]
谢谢楼上,我那个举例,意思是希望有一个通用的 表示任意字符的子匹配,不一定是在HTML代码里 ,所以 [^>] 这个不合适。
[/Quote]
k39k39 2010-12-08
  • 打赏
  • 举报
回复
谢谢楼上,我那个举例,意思是希望有一个通用的 表示任意字符的子匹配,不一定是在HTML代码里 ,所以 [^>] 这个不合适。
s11ss 2010-12-05
  • 打赏
  • 举报
回复
<div id="123"([^>]*)>

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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