Как удалить возможно заключенный в скобки номер версии? - PullRequest
1 голос
/ 15 апреля 2019

Я хочу использовать RegEx для удаления номеров версий из названий продуктов. Имена могут выглядеть так:

SampleProduct 2.0

Они также могут иметь круглые скобки вокруг номера версии:

SampleProduct (2.1)

Поэтому я попытался определить группу для номера версии и альтернативу для версии в скобках:

\s((?<versionNumber>\d+(\.\d+)*)|\(\k<versionNumber>\))\z

Но это не дает совпадений. Поскольку шаблон довольно маленький, я попытался получить доступ к группе с индексом:

\s((\d+(\.\d+)*)|\(\2\))\z

Это тоже не сработало. Кстати, в каком порядке индексируются вложенные группы? Упорядочены ли они по появлению их открытых или закрывающих скобок? В любом случае, ни один из \1, \2 и \3 не дал совпадения.

Я пытался выяснить, неправильно ли я понял функцию Regex. Когда я экспериментирую с группами и альтернативами по отдельности, они работают как положено. Но когда я смешиваю эти две функции, в какой-то момент он перестает работать, и я не могу определить проблему. В настоящее время я успешно использую выражение без группировки для удаления версии:

name = name.Substring(0, name.Length - Regex.Match(name, @"\s(\d+(\.\d+)*|\(\d+(\.\d+)*\))\z").Value.Length);

Но я бы хотел избежать дублирования шаблонов.

1 Ответ

1 голос
/ 15 апреля 2019

Если вы хотите избежать повторения части шаблона в регулярном выражении и просто хотите соответствовать 2.0 или (2.0), НО (2.0 или 2.0), вы можете использовать условное regex:

(\()?\d+(?:\.\d+)*(?(1)\))

См. демонстрационную версию regex .

Если есть только одна скобка, она не станет частью совпадения.

Подробности

  • (\()? - Дополнительная группа захвата # 1: ( char (если нет (, значение этой группы составляет null и последующая проверка (?(1)...) завершится неудачно)
  • \d+ - 1 или более цифр
  • (?:\.\d+)* - 0 или более повторов . и 1+ цифр
  • (?(1)\)) - условная конструкция: если сопоставлена ​​группа 1, ) должно быть сопоставлено, иначе нечего сопоставлять (отсутствует |...), иначе условная часть означает, что что-либо может следовать шаблону ранее).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...