我希望匹配特定单词的任何内容(例如,C */
中的结束评论),但是,由于性能原因,我不想使用非贪婪的运算符。
例如,匹配C评论:/\*.*?\*/
对我的文件来说太慢了。有没有提高绩效的可能性?
答案 0 :(得分:8)
当然,请使用unrolling-the-loop technique:
/\*[^*]*(?:\*(?!/)[^*]*)*\*/
请参阅regex demo
展开循环技术是基于这样的假设:在大多数情况下,你在重复的交替中,这种情况应该是最常见的,哪一种是例外的。我们将调用第一个,正常情况和第二个,特殊情况。然后,展开循环技术的一般语法可以写成:
normal* ( special normal* )*
这可能意味着,匹配正常情况,如果你找到一个特殊情况,匹配它比再次匹配正常情况。您会注意到这种语法的一部分可能会导致超线性匹配。为避免追加无休止的匹配,应谨慎应用以下规则:
- 特殊情况的开始和正常情况必须互为排斥
- special必须始终匹配至少一个字符
- 特殊表达式必须是原子的:请注意
( special normal* )*
可以缩减为(special)*
这一事实,如果特殊special*
,则变为类似于(a*)*
这是一种不确定的表达。
C#模式声明(使用逐字字符串文字):
var pattern = @"/\*[^*]*(?:\*(?!/)[^*]*)*\*/";
正则表达式分解:
/\*
- 文字/*
[^*]*
- 除*
(?:\*(?!/)[^*]*)*
- 0个或更多个序列...
\*(?!/)
- 文字*
后面没有/
[^*]*
- 除*
\*/
- 文字*/
这是一个图表,显示3个可能相同的正则表达式的效率(在regexhero.net测试*):
*针对/* Comment
* Typical
* Comment
*/
答案 1 :(得分:1)