#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 означает, что все может следовать шаблону раньше).