我想将任何内容匹配到特定单词(例如,C 中的结束评论*/
),但是,由于性能原因,我不想使用非贪婪运算符。
例如,要匹配 C 注释:/\*.*?\*/
对于我的文件来说太慢了。有没有可能提高性能?
当然可以,使用展开循环技术 http://www.softec.lu/site/RegularExpressions/UnrollingTheLoop:
/\*[^*]*(?:\*(?!/)[^*]*)*\*/
See
展开循环技术基于这样的假设:在大多数情况下,您通过重复的交替知道哪种情况应该是最常见的,哪种情况是例外的。我们将第一个称为正常情况,第二个称为特殊情况。展开循环技术的一般语法可以写为:
normal* ( special normal* )*
这可能意味着,匹配正常情况,如果您发现特殊情况,则匹配它而不是再次匹配正常情况。您注意到此语法的一部分可能会导致超线性匹配。为了避免无休止的追加匹配,应仔细应用以下规则:
- 特殊情况和正常情况的开始必须是互斥的
- 特殊字符必须始终匹配至少一个字符
- 特殊表达式必须是原子的:请注意以下事实:
( special normal* )*
可以减少到(special)*
,如果特殊的话是special*
,这变得类似于(a*)*
这是一个不确定的表达式。
C# 模式声明(使用逐字字符串文字):
var pattern = @"/\*[^*]*(?:\*(?!/)[^*]*)*\*/";
正则表达式细分:
-
/\*
- 字面意思/*
-
[^*]*
- 0 个或更多字符*
-
(?:\*(?!/)[^*]*)*
- 0 or more sequences of...
-
\*(?!/)
- 字面意思*
没有跟随/
-
[^*]*
- 0 个或更多字符*
-
\*/
- 字面意思*/
下面的图表显示了 3 个可能相同的正则表达式的效率(在正则英雄网 http://regexhero.net/tester*):
* 测试针对/* Comment
* Typical
* Comment
*/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)