正则表达式问题(新手)

Fux*_*uxi 0 regex url

我正在为垃圾邮件检查编写一个小应用程序,我遇到了正则表达式的问题.

让我说我有这个垃圾邮件网址:

http://hosting.tyumen.ru/tip.html 
Run Code Online (Sandbox Code Playgroud)

所以我想检查其网址是否有2个句号(子域+结尾),斜线,单词,句号和"html".

这是我到目前为止所得到的:

<a href="(http://.*?\..*?..*?/.*?.html)">(http://.*?\..*?..*?/.*?.html)</a>
Run Code Online (Sandbox Code Playgroud)

可能看起来像垃圾,但它的工作 - 问题:它真的很慢,冻结了我的应用程序.

有关如何优化它的任何提示?thx.re

Dav*_*und 5

它变慢的原因是以?这种方式使用的非贪婪运算符容易发生灾难性的回溯

而不是说"任何数量的任何东西,但只是在不与后来的要求相冲突的程度",这实际上.*?是说,试着"尽可能地要求,这不是双引号,哪个会终止href":

<a href="(http://[^"]+\.[^"]+\.[^"]+/[^"]+.html)">\1</a>
Run Code Online (Sandbox Code Playgroud)

我还在\1你的第一个捕获组中添加了一个反向引用()<a>...</a>,这样你就不必重新进行完全相同的匹配.

请注意,如果a具有类名,id或其正文中的任何其他内容,则此正则表达式将被破坏.我这样离开了,因为我想尽可能少地给你你所要求的东西,并尽可能地给你.

  • 对于你的子域名和域名匹配(至少),我会使用`[^".] +`来帮助更多回溯. (2认同)