Регулярное выражение захватить многосимвольный разделитель

Я пытаюсь выучить регулярные выражения, но до сих пор понятия не имею. У меня есть эта строка кода, которая успешно отделяет заполнитель '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>.*?)$"

Пример:

(.*?)/>>(.*?)$

Визуализация регулярных выражений

Debuggex Demo

Удаление трейлинга $ извлечет пустую строку для второй группы совпадений, потому что "" самая короткая возможная строка, удовлетворяющая выражению .*?

(.*?)/>>(.*?)$ на 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 будет короче.
Другие вопросы по тегам