正则表达式条件组名称

问题描述 投票:1回答:1

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

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

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

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

See here

我有很多方法可以在代码中解决这个问题,但我认为如果可以在正则表达式中处理它会更加优雅。因此,这是我的问题:如果第3组没有匹配,第2组(length_or_diameter)可以命名为“length”,如果第3组确实有匹配,那么命名为“diameter”,而不是命名为length_or_diameter并且需要更多代码中的逻辑?

regex match condition regex-group named
1个回答
1
投票

您只能为命名的捕获组使用一个名称,并且在创建模式后无法动态更改它。

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

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

regex101 PCRE demo。这是与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 in Group“type”
  • - - -
  • (?:(?'diameter'\d+)x)? - 可选的非捕获组匹配 (?'diameter'\d+) - 组diameter中的1位或更多位数 x - x char
  • (?'length'\d+)? - 一个可选的捕获组“长度”,1位数。
© www.soinside.com 2019 - 2024. All rights reserved.