2014-10-06 2 views
2

Я пытаюсь изучить регулярное выражение, но до сих пор не знаю. У меня есть эта строка кода, которая успешно отделяет заполнитель «FirstWord» в «{» разделителем из всех следующим текстом:regex capture multi character delimiter

var regexp = new Regex(@"(?<FirstWord>.*?)\{(?<TextBetweenCurlyBrackets>.*?)\}"); 

, который читает эту строку без проблем:

Greetings {Привет World}

То, что я хочу сделать, это заменить «{» с характером цепи, как, например, «/» >> поэтому я попытался это:

var regexp = new Regex(@"(?<FirstWord>.*?)\/>>(?<OtherText>.*?)\"); 

Я удалил последнюю скобку и заменил первый на «/ >>», но он выдает исключение ArgumentException. Как бы выглядела правильная комбинация символов?

+1

Верьте или нет на самом деле является разбалансировка побег в своем регулярном выражении '/ >> \ <( *?.?) ( *?.?) - несбалансированный '\'' – sln

ответ

2

/ не нужно экранировать, если не использовать его в качестве шаблона-разделителем .:

@"(?<FirstWord>.*?)/>>(?<OtherText>.*?)\" 

Кроме того, ваш последний \ будет в основном избежать ", который должен положить конец строки (C# -wise: удалить она):

@"(?<FirstWord>.*?)/>>(?<OtherText>.*?)" 

И так как вы хотите, скорее всего, не получать до конца строки (.*? будет получать как меньше символов, необходимые для удовлетворения выражения), вы должны использовать $ в конце или использовать любой другой вид разделителя (whitspace, linebreak и т. Д.).

@"(?<FirstWord>.*?)/>>(?<OtherText>.*?)$" 

Пример:

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

Regular expression visualization

Debuggex Demo

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

(.*?)/>>(.*?)$ на This/>>Test One будет соответствовать This и Test One

(.*?)/>>(.*?)\s на This/>>Test One будет соответствовать This и Test

(.*?)/>>(.*?) на This/>>Test One будет соответствовать This и ""

Примечание: Я говорю " "является самым коротким s возможно, удовлетворяющее выражению.? * Нарочно! Частая ошибка - интерпретировать .*?a как «все до а»:

  • Regex жадный по умолчанию!
  • В поисках expressiong (.*?)a$ на «CABA» будет НЕне совпасть - он будет возвращать cab, потому что cab следуют a является удовлетворением выражения и cab является самой короткой строкой возможно любой матча!.
  • Можно было бы ожидать, что b будет соответствовать - но регулярное выражение работает слева направо, поэтому прерывается, как только оно будет найдено cab - даже если b будет короче.
+0

Спасибо большое для решения и понимания того, что в Интернете есть такие вещи, как Debuggex. Отличный ответ! – betaFlux