代码之家  ›  专栏  ›  技术社区  ›  Sedat Kapanoglu johnnywhoop

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

  •  2
  • Sedat Kapanoglu johnnywhoop  · 技术社区  · 17 年前

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

    但子模式要复杂得多。除了现有的组之外,我基本上想匹配不属于任何这些组的任何内容。

    我试过了

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

    还有别的办法吗?如果这不起作用,我将不得不编写一个特设解析器。

    示例文本如下

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

    我想抓住中间的部分。

    4 回复  |  直到 17 年前
        1
  •  2
  •   Bartek Szabat    17 年前

    正则表达式为g1、g2、g3之外的每个字符生成单独的匹配。因此,当您将其与MatchEvaluator一起使用时,它会生成大量的评估器调用。这就是为什么它很慢。

    如果你尝试使用以下正则表达式:

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

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

    否定,因为我不想抄袭

    为什么不像这样:

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

        3
  •  1
  •   Nicholas Mancuso    17 年前

        4
  •  0
  •   Rex M    17 年前

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

    推荐文章