Как удалить выражение, возможно заключенное в скобки, из строки?

#c# #.net #regex

#c# #.net #регулярное выражение

Вопрос:

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

SampleProduct 2.0

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

SampleProduct (2.1)

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

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

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

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

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

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

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

Но я хотел бы исключить дублирование шаблона.

Комментарии:

1. В этом случае есть другое решение ( сбалансированные группы ), которое не требует повторного использования частей шаблона и позволит OP иметь более чистое регулярное выражение.

Ответ №1:

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

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

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

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

Подробные сведения

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