我似乎找不到任何有关此的信息,所以我不确定这是否可行,但是这里有:
是否可以为匹配组的名称提供多个选项?我从代码中获取参数,然后使用正则表达式组名来使用它们。但是,我的序列具有多种(非常相似)格式,并且参数的顺序也会改变。因此,我的问题是:如果另一个组不匹配,一个组可以使用不同的名称吗?
示例:(?'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并且需要更多代码中的逻辑?
答案 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。这一场比赛
(?'type'A|B|C)
-A
,B
或C
-
-一个-
(?:(?'diameter'\d+)x)?
-可选的非捕获组匹配
(?'diameter'\d+)
-diameter
组中的1位或更多数字x
-一个x
字符(?'length'\d+)?
-可选的捕获组“长度”,超过1个数字。