Регулярное выражение захватить многосимвольный разделитель
Я пытаюсь выучить регулярные выражения, но до сих пор понятия не имею. У меня есть эта строка кода, которая успешно отделяет заполнитель 'FirstWord' разделителем '{' от всего следующего текста:
var regexp = new Regex(@"(?<FirstWord>.*?)\{(?<TextBetweenCurlyBrackets>.*?)\}");
Который читает эту строку без проблем:
Привет {Hello World}
Я хочу заменить '{' на цепочку символов, например '/>>', поэтому я попробовал это:
var regexp = new Regex(@"(?<FirstWord>.*?)\/>>(?<OtherText>.*?)\");
Я удалил последнюю скобку и заменил первую на '/>>', но она выдает исключение ArgumentException. Как будет выглядеть правильная комбинация символов?
1 ответ
/
не нужно экранировать, если вы не используете его как разделитель шаблонов.
@"(?<FirstWord>.*?)/>>(?<OtherText>.*?)\"
Также ваш последний \
будет в основном избежать "
которая должна завершать строку (C#-wise: удалить ее):
@"(?<FirstWord>.*?)/>>(?<OtherText>.*?)"
И так как вы хотите, скорее всего, получить до конца строки (.*?
получит как можно меньше символов, необходимых для выражения), вы должны использовать $
в конце или используйте любой другой вид разделителя (пробел, перевод строки и т. д.).
@"(?<FirstWord>.*?)/>>(?<OtherText>.*?)$"
Пример:
(.*?)/>>(.*?)$
Удаление трейлинга $
извлечет пустую строку для второй группы совпадений, потому что ""
самая короткая возможная строка, удовлетворяющая выражению .*?
(.*?)/>>(.*?)$
на This/>>Test One
будет соответствовать This
а также Test One
(.*?)/>>(.*?)\s
на This/>>Test One
будет соответствовать This
а также Test
(.*?)/>>(.*?)
на This/>>Test One
будет соответствовать This
а также ""
Примечание. Я говорю "" - это самая короткая строка из возможных, удовлетворяющая выражению.? * специально! Частая ошибка - интерпретировать .*?a
как "все пока":
- По умолчанию Regex жадный!
- Поиск выражения g
(.*?)a$
на "каба" не подведет - вернетсяcab
!, так какcab
с последующимa
удовлетворяет выражению Иcab
самая короткая строка, возможная для любого совпадения. - Можно также ожидать
b
быть сопоставленным - но регулярное выражение работает слева направо, следовательно, прерывается, как только оно найденоcab
- даже еслиb
будет короче.