正则表达式条件组名称
Regex conditionnal group name
我似乎找不到任何关于此的信息,所以我不确定这是否可能,但这里是:
有没有办法让匹配组的名称有多个选项?我从代码中获取参数,然后使用正则表达式组名称来使用它们。但是,我的序列有多种(非常非常相似)格式,并且参数的顺序会发生变化。因此,我的问题是:如果另一个组不匹配,一个组可以有不同的名称吗?
示例:(?'type'A|B|C)-(?'length_or_diameter'\d+)(?:x(?'length'\d+))?
代码格式:(type)-(length)
或 (type)-(diameter)x(length)
我可以通过代码 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)
- A
、B
或 C
组 "type"
-
- 一个-
(?:(?'diameter'\d+)x)?
- 可选的非捕获组匹配
(?'diameter'\d+)
- 组 diameter
中的 1 个或多个数字
x
- 一个 x
字符
(?'length'\d+)?
- 一个可选的捕获组 "length",1+ 位数字。
我似乎找不到任何关于此的信息,所以我不确定这是否可能,但这里是:
有没有办法让匹配组的名称有多个选项?我从代码中获取参数,然后使用正则表达式组名称来使用它们。但是,我的序列有多种(非常非常相似)格式,并且参数的顺序会发生变化。因此,我的问题是:如果另一个组不匹配,一个组可以有不同的名称吗?
示例:(?'type'A|B|C)-(?'length_or_diameter'\d+)(?:x(?'length'\d+))?
代码格式:(type)-(length)
或 (type)-(diameter)x(length)
我可以通过代码 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)
-A
、B
或C
组 "type"-
- 一个-
(?:(?'diameter'\d+)x)?
- 可选的非捕获组匹配(?'diameter'\d+)
- 组diameter
中的 1 个或多个数字
x
- 一个x
字符
(?'length'\d+)?
- 一个可选的捕获组 "length",1+ 位数字。