【发布时间】:2010-10-02 13:08:27
【问题描述】:
我正在(用 C# 编写)一个简单的解析器来处理一种看起来很像经典 C 的脚本语言。
在我拥有的一个脚本文件中,我用来识别 /* block cmets */ 的正则表达式正在进入某种无限循环,占用 100% 的 CPU 很长时间。
我使用的正则表达式是这样的:
/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/
关于为什么这可能会被锁定的任何建议?
或者,我可以使用什么其他正则表达式来代替?
更多信息:
- 在面向 .NET 3.5 的 C# 3.0 中工作;
- 我正在使用 Regex.Match(string,int) 方法从字符串的特定索引处开始匹配;
- 我已经让程序运行了一个多小时,但比赛还没有完成;
- 传递给 Regex 构造函数的选项是
RegexOptions.Multiline和RegexOptions.IgnorePatternWhitespace; - 正则表达式适用于我的 453 个测试文件中的 452 个。
【问题讨论】:
-
以这种方式使用正则表达式很困难。如何区分注释和包含与注释相同语法的序列的字符串?
-
在他的《掌握正则表达式》一书中,Jeffrey Friedl 解释了人们认为几乎不可能获得一个涵盖所有 /* 引用字符串组合的 C 注释查找器,反之亦然,等等。但他接着描述了一个复杂的正则表达式。
-
@Gumbo - 我使用这个正则表达式来检查从已知索引点开始的评论,而不是文本中的任何地方。当我找到一个字符串或评论时,我会跳过整个跨度,然后再检查另一个匹配项。
标签: c# c regex parsing comments