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