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

D.R*_*.R. 9 c# regex

我希望将任何内容与特定单词匹配(例如,C中的结束注释*/),但是,由于性能原因,我不想使用非贪婪的运算符.

例如,匹配C注释:/\*.*?\*/对我的文件来说太慢了.有没有可能提高性能?

Wik*_*żew 9

当然,使用展开循环技术:

/\*[^*]*(?:\*(?!/)[^*]*)*\*/
Run Code Online (Sandbox Code Playgroud)

请参阅正则表达式演示

展开循环技术是基于这样的假设:在大多数情况下,你知道重复的交替,这种情况应该是最常见的,哪一种是例外的.我们将调用第一个,正常情况和第二个,特殊情况.然后,展开循环技术的一般语法可以写成:

normal* ( special normal* )*

这可能意味着,匹配正常情况,如果你找到一个特殊情况,匹配它比再次匹配正常情况.您会注意到这种语法的一部分可能会导致超线性匹配.为避免追加无休止的匹配,应谨慎应用以下规则:

  • 特殊情况的开始和正常情况必须是相互排斥的
  • special必须始终匹配至少一个字符
  • 特殊的表达式必须是原子的:要小心( special normal* )*可以减少的事实,(special)*如果特殊的话special*,这变得类似于(a*)*一个不确定的表达式.

C#模式声明(使用逐字字符串文字):

var pattern = @"/\*[^*]*(?:\*(?!/)[^*]*)*\*/";
Run Code Online (Sandbox Code Playgroud)

正则表达式细分:

  • /\* - 字面意思 /*
  • [^*]* - 0以外的字符 *
  • (?:\*(?!/)[^*]*)* - 0或更多序列...
    • \*(?!/)- *没有后跟的文字/
    • [^*]* - 0以外的字符 *
  • \*/ - 字面意思 */

下面是一个图表,显示3个可能相同的正则表达式的效率(在regexhero.net*上测试):

在此输入图像描述

*经过测试 /* Comment * Typical * Comment */

  • @stribizhev:在阅读"掌握正则表达式"后,我发现版本`/\*[^*]*\*+([^/*] [^*]*\*+)*/`是另一个3.5 %快(根据RegexHero.net). (3认同)