我似乎无法找到任何关于此的信息,所以我不确定这是否可行,但是这里有:
有没有办法为匹配组的名称提供多个选项?我从代码中获取参数,然后使用正则表达式组名称来使用它们。但是,我的序列有多种(非常非常相似)格式,参数顺序也会发生变化。因此,我的问题是:如果另一个组不匹配,组可以有不同的名称吗?
示例:(?'type'A|B|C)-(?'length_or_diameter'\d+)(?:x(?'length'\d+))?
代码格式:(type)-(length)
或(type)-(diameter)x(length)
我有很多方法可以在代码中解决这个问题,但我认为如果可以在正则表达式中处理它会更加优雅。因此,这是我的问题:如果第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。这是与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)
- A
,B
或C
in Group“type”-
- -
(?:(?'diameter'\d+)x)?
- 可选的非捕获组匹配
(?'diameter'\d+)
- 组diameter
中的1位或更多位数
x
- x
char(?'length'\d+)?
- 一个可选的捕获组“长度”,1位数。