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

在正则表达式中使用可选块进行分组编号

  •  8
  • Stroboskop  · 技术社区  · 15 年前

    有没有办法把表达式放在括号里 被困在一个团体里?

    (A(B|C)?) D (E(F|G)?)
    

    注意可选块 (B|C)? (F|G)? 需要括号。
    我对在这些群体中发现的东西不感兴趣。我只想赶上第一个和最后一个街区。

    但由于可选块的存在,组编号将发生变化,我无法判断 (E(F|G)?)

    我是否可以告诉表达式忽略结果组中的可选部分,以便组编号保持不变?或者,我可以让可选捕获始终以组的形式出现吗?即使它们为空?

    2 回复  |  直到 15 年前
        1
  •  15
  •   finnw    15 年前

    (E(F|G)?) 将始终被捕获为组3。编号由模式字符串中左括号的顺序决定,即:

    (A(B|C)?) D (E(F|G)?)
    ^ ^         ^ ^
    1 2         3 4
    

    (B|C) 则在输入字符串中不出现 group(2) 将返回null,但后续组将不会重新编号。

    唯一不影响编号的组是非捕获组,例如。

    (A(?:B|C)?) D (E(?:F|G)?)
    ^             ^
    1             2
    

    Pattern pattern = Pattern.compile("(A(B|C)?) D (E(F|G)?)");
    Matcher matcher = pattern.matcher("A D EG");
    if (matcher.matches()) {
        System.err.println(matcher.group(1));
        System.err.println(matcher.group(2));
        System.err.println(matcher.group(3));
        System.err.println(matcher.group(4));
    }
    

    输出:

    A
    null
    EG
    G
    
        2
  •  9
  •   Gumbo    15 年前

    存在非捕获组 (?:…)

    (A(?:B|C)?) D (E(?:F|G)?)