代码之家  ›  专栏  ›  技术社区  ›  Jimmy

regex:捕获、分组、混淆

  •  0
  • Jimmy  · 技术社区  · 14 年前

    我似乎不知道regex(.net)中的captures+groups。

    假设我有以下输入字符串,其中每个字母实际上是更复杂的regex表达式的占位符(因此简单的字符排除不起作用):

    CBDAEDBCEFBCD
    

    或者,更一般地说,这里有一个用“regex”编写的字符串模式:

    (C|B|D)*A(E*)(D|B|C)*(E*)F(B|C|D)*
    

    只有一个A和一个F。 我需要把所有B、C、D(在我的应用程序中是更复杂的组)的实例捕获为单个“捕获”(或匹配或组),这些实例发生在A之后和F之前。我也需要A和F。我不需要E。我也不需要C、B、D出现在A之前或B、C、D出现在F之后。

    我希望正确的结果是:

    Groups["start"] (1 capture) = A
    Groups["content"] (3 captures)  
      Captures[0] = D  
      Captures[1] = B
      Captures[2] = C
    Groups["end"] (1 capture) = F
    

    我试了几次微弱的尝试,但都没有成功。

    只有“错误地”捕获上面示例字符串中ef之前的最后一个c(以及正确的start=a,end=f)

    (?<=(?<start>A)).+(?<content>B|C|D).+(?=(?<end>F))
    

    与上面的结果相同(只是在(?)后面加了一个+号。b c d)条)

    (?<=(?<start>A)).+(?<content>B|C|D)+.+(?=(?<end>F))
    

    摆脱了环顾四周的东西…与上述结果相同

    (?<start>A).+(?<content>B|C|D)+.+(?<end>F)
    

    然后我的白手起家的大脑开始罢工。

    那么,正确的方法是什么?是否真的需要环顾四周?

    谢谢!

    2 回复  |  直到 14 年前
        1
  •  2
  •   Alan Moore Chris Ballance    14 年前

    是的,忘了环顾四周,它们只是不必要地把事情复杂化。但我怀疑如果你先做的话,你最后的正则表达式会起作用的。 .+ 不情愿:

    (?<start>A).+?(?<content>B|C|D)+.+(?<end>F)
    

    编辑: 是的 :

    string s = "CBDAEDBCEFBCD";
    Regex r = new Regex(@"(?<start>A).+?(?<content>B|C|D)+.+(?<end>F)");
    
    foreach (Match m in r.Matches(s))
    {
      Console.WriteLine(@"Groups[""start""] = {0}", m.Groups["start"]);
      foreach (Capture c in m.Groups["content"].Captures)
      {
        Console.WriteLine(@"Capture[""content""] = {0}", c.Value);
      }
      Console.WriteLine(@"Groups[""end""] = {0}", m.Groups["end"]);
    }
    

    输出:

    Groups["start"] = A
    Capture["content"] = D
    Capture["content"] = B
    Capture["content"] = C
    Groups["end"] = F
    
        2
  •  0
  •   Bart Kiers    14 年前

    因为你说了 C,B,D ,我想您应该使用分组 [CBD]* 另外,如果你只是在找信后的东西 A 但之前 F ,那么您应该能够使用这些文字以及一些排除。

    这是我想出的一个模式。组 $4 应该包含字母 DBC

    ([^A]*)(A)([^CBDF]*)([CBD]*)([^F]*)(F)(.*)
    

    下面是一个例子 this pattern in action .

    问题是,如果原始字符串是 CBDAEDEBECEFBCD ?