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

时间:2015-11-24 14:10:01

标签: c# regex

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

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

2 个答案:

答案 0 :(得分:8)

当然,请使用unrolling-the-loop technique

/\*[^*]*(?:\*(?!/)[^*]*)*\*/

请参阅regex demo

  

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

     

normal* ( special normal* )*

     

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

     
      
  • 特殊情况的开始和正常情况必须互为排斥
  •   
  • special必须始终匹配至少一个字符
  •   
  • 特殊表达式必须是原子的:请注意( special normal* )*可以缩减为(special)*这一事实,如果特殊special*,则变为类似于(a*)*这是一种不确定的表达。
  •   

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

var pattern = @"/\*[^*]*(?:\*(?!/)[^*]*)*\*/";

正则表达式分解:

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

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

enter image description here

*针对/* Comment * Typical * Comment */

进行了测试

答案 1 :(得分:1)

试试这个:

/\*(?:[^*]|\*(?!/))*\*/

我不知道它是否比stribizhev的答案更快。