Квантификатор регулярных выражений для альтернатив (вертикальная полоса |)

Я хочу обрезать строку, если она начинается и/или заканчивается, например, foo или bar, и хочу получить внутреннюю строку в группе регулярных выражений.
Например

"fooTestbar" должен быть "Test",
"Test2bar" ​​должен быть "Test2"
, а "Test3" должен быть "Test3".

Мое текущее регулярное выражение:

^(foo|bar)?(.*)(foo|bar)?$

но это не работает, потому что я не могу применить квантификатор ? к альтернативной группе ((foo|bar)).

Мой код

static string returnMatch(string text){
string pattern = @"^(foo|bar)?(.*)(foo|bar)?$";
return System.Text.RegularExpressions.Regex.Match(text, pattern).Groups[2].Value;
}

Любая помощь будет оценена.


person Tearsdontfalls    schedule 30.10.2012    source источник
comment
Почему ты не можешь? Какой язык/инструмент вы используете?   -  person Martin Ender    schedule 30.10.2012
comment
Я использую .Net System.Text.RegularExpressions.Regex.Match с С#, это не сработало.   -  person Tearsdontfalls    schedule 30.10.2012


Ответы (2)


Вы можете использовать это

^(?:foo|bar)?(.*?)(?:foo|bar)?$

Теперь вы можете сопоставить это так.

return Regex.Match(input,"^(?:foo|bar)?(.*?)(?:foo|bar)?$").Groups[1].Value;
person Anirudha    schedule 30.10.2012
comment
Спасибо, но это сработало только для начала foo|bar, а не для и - person Tearsdontfalls; 31.10.2012
comment
Спасибо, у меня это сработало с небольшим редактированием, Regex.Matches не имеет параметра замены. - person Tearsdontfalls; 31.10.2012
comment
Ваше регулярное выражение решает этот вопрос, мне не нужно делать Regex.Matches, я могу делать только Regex.Match, и у меня есть правильный результат в группе 1. Спасибо вам и всем остальным за вашу помощь. - person Tearsdontfalls; 31.10.2012

Я предлагаю вам пойти с

(?:^|(?<=^foo)).*?(?=bar$|$)

или, если вы хотите разрешить foo и/или bar в начале и в конце, то с помощью

(?:^|(?<=^foo)|(?<=^bar)).*?(?=foo$|bar$|$)

что привело к Groups[0]

person Ωmega    schedule 30.10.2012
comment
Это заменяет только foo в начале, а не, например, строку в начале, а замена в конце не работает. - person Tearsdontfalls; 31.10.2012
comment
@Tearsdontfalls - я не вижу такого примера в вашем вопросе ... Я обновил свой ответ этой альтернативой. - person Ωmega; 31.10.2012
comment
Хорошо, я объяснил это, может быть, немного плохо, с вашим обновленным регулярным выражением он заменяет только foo|bar в конце. - person Tearsdontfalls; 31.10.2012
comment
@Tearsdontfalls - в вашем коде должна быть опечатка, так как мой обновленный ответ/решение должен работать правильно. Проверьте свой код... - person Ωmega; 31.10.2012