不是那个懒惰的正则表达式匹配?

时间:2009-02-24 19:32:05

标签: c# .net regex

我有一个C#Regex类,可以匹配多个子组,例如

(?<g1>abc)|(?<g2>def)|(?<g3>ghi) 

但是有更复杂的子模式。除了现有的组之外,我基本上想要匹配任何不属于这些组的东西。

我试过

(?<g1>abc)|(?<g2>def)|(?<g3>ghi)|(.+?) 

但结果太慢了。我不能否定,因为我不想冗余地复制那些复杂的子模式。使用just(。+)会按预期覆盖所有其他组。

还有其他方法吗?如果这不起作用,我将不得不编写一个特殊的解析器。

其他详细信息:所有这些组都是根据MatchEvaluator进行评估的。因此,将“不匹配的字符串”发送到MatchEvaluator的Regex类行为也将起作用。

示例文本为

.......abc........ghi.....def.....abc....def...ghi......abc.......

我想在中间抓住部分。

4 个答案:

答案 0 :(得分:2)

  

但结果太慢了。我做不到   否定因为我不想复制   那些复杂的子模式是多余的。

为什么不能这样:

const string COMPLEX_REGEX_PATTERN = "\Gobbel[dy]go0\k"

答案 1 :(得分:2)

你的正则表达式为g1,g2,g3之外的每个字符生成单独的匹配。因此,当您将其与MatchEvaluator一起使用时,它会生成许多评估程序调用。这就是它缓慢的原因。

如果您尝试使用正则表达式:

(?<rest>.*?)((?<g1>abc)|(?<g2>def)|(?<g3>ghi)|$)

对于不包含“g”组的整个文本片段,您将获得单个“休息”组匹配。

Regex C#代码:

Regex regex = new Regex(
    @"(?<rest>.*?)((?<g1>abc)|(?<g2>def)|(?<g3>ghi)|$)",
    RegexOptions.Singleline
    | RegexOptions.Compiled
    );

答案 2 :(得分:1)

您是否尝试过设置要编译的正则表达式选项?我发现使用静态编译的正则表达式可以大大加快速度。

答案 3 :(得分:0)

如果你的正则表达式长达四页,那么自己写一个状态机可能是个更好的主意......