正则表达式匹配任何单词 – 没有非贪婪的运算符

我希望将任何内容与特定单词匹配(例如,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的答案更快。