Как сказал Дэвид Гладфелтер, реальная проблема в том, что когда вы делаете его необязательным, он не совпадает с ;однако предложенное им исправление не сработает . Правка 1: Вам нужно будет использовать то, что он вложил в свою правку (которая была написана, когда я писал это).Проблема в том, что квантификаторы (*
, +
, ?
, {n,m}
) жадные : они всегда совпадают настолько, насколько возможно.Таким образом, когда вы пишете ^.*(\{\w+\})?
, .*
всегда будет соответствовать всей строке, потому что пустое соответствие удовлетворяет необязательной группе.Также обратите внимание, что хотя ?
является жадным, первая жадность (из .*
) имеет приоритет.Если вам разрешено иметь только фигурные скобки вокруг этой необязательной группы, то вы можете решить свою проблему, прямо сказав: ^[^\{]*(\{\w+\})?
.Таким образом, первый фрагмент будет соответствовать всему, вплоть до первой фигурной скобки, а затем (так как ?
является жадным), если это возможно, соответствовать слову в фигурных скобках.
Зачастую другой способ решить эту проблемучтобы сделать квантификаторы ленивыми (или не жадными, минимальными и т. д.), добавив ?
: *?
, +?
, ??
и {n,m}?
.Однако это вам здесь не поможет: вместо этого, если вы сделаете ^.*?(\{\w+\})?
, ленивый .*?
попытается сопоставить ноль символов, успешно, а затем необязательная группа не будет соответствовать.Тем не менее, хотя это не сработает, это полезный инструмент в вашем наборе инструментов. Edit 1: Также обратите внимание, что они доступны не во всех движках регулярных выражений, хотя они доступны в C #.