Regex условное имя группы - PullRequest
       25

Regex условное имя группы

0 голосов
/ 27 февраля 2019

Я не могу найти какую-либо информацию об этом, поэтому я не уверен, возможно ли это, или нет, но здесь идет речь:

Есть ли способ иметь несколько опций для имениподходящая группа?Я получаю параметры из кода и использую имена групп регулярных выражений, чтобы потом их использовать.Однако моя последовательность имеет несколько (очень очень похожих) форматов, и порядок параметров меняется.Поэтому мой вопрос: может ли группа иметь другое имя, если другая группа не соответствует?

Пример: (?'type'A|B|C)-(?'length_or_diameter'\d+)(?:x(?'length'\d+))?

Форматы кода: (type)-(length) ИЛИ (type)-(diameter)x(length)

См. Здесь

У меня есть способы поиграться с этим в коде, но я думаю, что было бы гораздо более элегантно, если бы это можно было рассмотреть в самом регулярном выражении.Поэтому, вот мой вопрос: есть ли способ для группы 2 (length_or_diameter) быть названным либо «длина», если группа 3 не имеет совпадения, либо «диаметр», если группа 3 имеет совпадение, вместо того, чтобы называться length_or_diameter и требовать большелогика в коде?

1 Ответ

0 голосов
/ 28 февраля 2019

Вы можете использовать только одно имя для именованной группы захвата и не можете изменить его динамически после создания шаблона.

Вы можете использовать группы с одинаковыми именами (если ваш движок регулярных выражений поддерживает их, как Onigmo в Ruby,библиотека регулярных выражений .NET или PCRE с включенной опцией J):

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

См. демонстрационную версию regex101 PCRE .Вот вариант с группой сброса ветви , (?|...|...):

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

См. Демонстрационную версию regex (не будет работатьхотя в .NET).

Другой обходной путь - поиграть с обходными путями и необязательными группами:

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

См. еще одну демонстрацию регулярных выражений .Этот соответствует

  • (?'type'A|B|C) - A, B или C в группе "тип"
  • - - -
  • (?:(?'diameter'\d+)x)? - необязательная группа без захвата, соответствующая
    • (?'diameter'\d+) - 1 или более цифр в группе diameter
    • x - x char
  • (?'length'\d+)? - дополнительная группа захвата "длина", 1+ цифр.
...