我正在使用正则表达式来删除html文件中的注释标记(模式是:" <!--(.|\s)*?--!?>")
但有些网站没有使用标准的html标签,示例:
<script language="javascript">
<!--
js code ...
</script>
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我的正则表达式将挂起,并且try-catch也不会捕获错误.我该如何解决这个问题?
Jan*_*rts 11
你的正则表达式的性能问题是微不足道的.不要这样做:
(.|\s)*
Run Code Online (Sandbox Code Playgroud)
量词是懒惰还是贪婪完全不是重点.问题是.和\ s不是互斥的.两者都可以匹配空格.和\ s.因此,如果正则表达式遇到空格,它将首先将空格与.匹配,如果正则表达式的其余部分失败,它将再次与\ s匹配.如果你有两个空格,它首先匹配.,然后第一个匹配.第二个用\ s,然后是第一个用\ s和第二个用.,然后两个用\ s.正如您所看到的,当您的正则表达式遇到一系列空格,后面跟着正则表达式的其余部分无法匹配时,其复杂度为O(2 ^ N).如果您有10个空格,则有1024个排列.如果你有32个空格,那么就有40亿个排列.
你只在正则表达式失败时才能看到问题的原因是当正则表达式成功时,.只需匹配所有空格,\ s永远不会得到任何动作.
我知道你要做的是什么:你想要匹配一系列"任何"字符,包括通常与点不匹配的换行符.正确的解决方案是设置RegexOptions.SingleLine并使用此正则表达式:
.*
Run Code Online (Sandbox Code Playgroud)
如果无法设置RegexOptions.SingleLine,请使用此模式修饰符执行相同操作:
(?s).*
Run Code Online (Sandbox Code Playgroud)
如果您不能使用该模式修饰符,例如因为JavaScript不支持它,请使用带有两个互补短序的字符类:
[\S\s]*
Run Code Online (Sandbox Code Playgroud)
一旦你从你的正则表达式中获得可怕的(.|\s)替换,它将完美地工作.没有必要使用其他建议的任何复杂的正则表达式.单个惰性量词总是线性扩展.不相互排斥的轮换总会杀死你的正则表达式.我的确称之为灾难性的回溯.
如果你想要一个允许标签终止评论的正则表达式,试试这个:
(?s)<!--.*?(-->|</script>)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4602 次 |
| 最近记录: |