正则表达式条件组名称

时间:2019-02-27 20:24:36

标签: regex match conditional-statements regex-group named

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

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

示例:(?'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并且需要更多代码中的逻辑?

1 个答案:

答案 0 :(得分: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。这一场比赛

  • 组“类型”中的{li> (?'type'A|B|C)-ABC
  • --一个-
  • (?:(?'diameter'\d+)x)?-可选的非捕获组匹配
    • (?'diameter'\d+)-diameter组中的1位或更多数字
    • x-一个x字符
  • (?'length'\d+)?-可选的捕获组“长度”,超过1个数字。