我希望将任何内容与特定单词匹配(例如,C中的结束注释*/),但是,由于性能原因,我不想使用非贪婪的运算符.
例如,匹配C注释:/\*.*?\*/对我的文件来说太慢了.有没有可能提高性能?
当然,使用展开循环技术:
/\*[^*]*(?:\*(?!/)[^*]*)*\*/
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
*/
| 归档时间: |
|
| 查看次数: |
255 次 |
| 最近记录: |