正则表达式条件组名称

Regex conditionnal group name

我似乎找不到任何关于此的信息,所以我不确定这是否可能,但这里是:

有没有办法让匹配组的名称有多个选项?我从代码中获取参数,然后使用正则表达式组名称来使用它们。但是,我的序列有多种(非常非常相似)格式,并且参数的顺序会发生变化。因此,我的问题是:如果另一个组不匹配,一个组可以有不同的名称吗?

示例:(?'type'A|B|C)-(?'length_or_diameter'\d+)(?:x(?'length'\d+))?

代码格式:(type)-(length)(type)-(diameter)x(length)

See here

我可以通过代码 fiddle 解决这个问题,但我认为如果可以在正则表达式本身中处理它会更优雅。因此,这是我的问题:如果第 3 组没有匹配项,是否可以将第 2 组 (length_or_diameter) 命名为 "length",如果第 3 组有匹配项,则命名为 "diameter",而不是被命名为 length_or_diameter 并且需要更多的代码逻辑?

命名捕获组只能使用一个名称,并且在创建模式后不能动态更改。

您可以使用同名组(如果您的正则表达式引擎支持它们,如 Ruby 中的 Onigmo、.NET 正则表达式库或启用 J 选项的 PCRE):

(?'type'A|B|C)-(?:(?'diameter'\d+)x(?'length'\d+)|(?'length'\d+))

参见 regex101 PCRE demo. Here is a variation with a branch reset group(?|...|...):

(?'type'A|B|C)-(?|(?'diameter'\d+)x(?'length'\d+)|()(?'length'\d+))

请参阅 regex demo(但在 .NET 中不起作用)。

另一种解决方法是使用环视和可选组:

(?'type'A|B|C)-(?:(?'diameter'\d+)x)?(?'length'\d+)?

参见 another regex demo。这个匹配

  • (?'type'A|B|C) - ABC 组 "type"
  • - - 一个-
  • (?:(?'diameter'\d+)x)? - 可选的非捕获组匹配
    • (?'diameter'\d+) - 组 diameter
    • 中的 1 个或多个数字
    • x - 一个 x 字符
  • (?'length'\d+)? - 一个可选的捕获组 "length",1+ 位数字。