2015-08-06 2 views
4

Я пытаюсь совместить текст между двумя разделителями, [% %], и я хочу получить все, содержит ли строка новые строки или нет.C# Regex Совпадение между или без новых строк

Код

string strEmailContent = sr.ReadToEnd(); 
string commentPatt = @"\[%((\r\n?|\n).*(\r\n?|\n))%\]"; 
Regex commentRgx = new Regex(commentPatt, RegexOptions.Singleline); 

Примеры входов

//Successful 
[% 
    New Comment 
%] other content from input 

//Match: [%\r\nNew Comment\r\n%] 

//Fail 
[% New Comment %] 

//Match: false 

//Successfully match single line with 
string commentPatt = @"\[%(.*)%\]"; 

//Match: [% New Comment %] 

Я не знаю, как совместить эти две модели, чтобы соответствовать оба случая. Может ли кто-нибудь помочь?

+0

Поскольку '.' соответствует любому символу, кроме' \ n', попробуйте 'строка commentPatt = @ "\ [% (|. \ П) *% \]" ; '. –

+0

Было бы уместно сопоставить любые пробелы вместо символов новой строки? Если это так, вы можете использовать сокращенный класс символов пробелов '\ s +' вместо '\ r \ n' –

ответ

1

Чтобы получить текст между двумя разделителями вам нужно использовать ленивого соответствие с .*?, а также соответствовать новым строке символов, вам нужен (?s) SingleLine модификатора так, что точка может также соответствовать новым строке символов:

(?s)\[%(.*?)%] 

(?s)\[%(.*?)%] Обратите внимание, что будет соответствовать даже если % находится внутри [%...%].

См. regex demo. Обратите внимание, что ] не должен быть экранирован, так как он расположен в однозначном положении и может быть интерпретирован только как литерал ].

В C#, вы можете использовать

var rx = new Regex(@"(?s)\[%(.*?)%]"); 
var res = rx.Matches(str).Cast<Match>().Select(p => p.Groups[1].Value).ToList(); 
+0

Это не сохраняет новые строки в C# .. Я не уверен, почему – ExceptionLimeCat

+0

Он делает, как нет обрезки. Покажите мне свой код. См. [Мое демо] (http://ideone.com/o8OwEs). –

+1

Да, я это видел. Вот почему я отмечаю это как ответ. Спасибо всем, кто помог. – ExceptionLimeCat

1

Попробуйте эту модель:

\[%([^%]*)%\] 

Он захватывает все символы между «[%» и «%]», который не является «%» характер.

Испытано @Regex101

Если вы хотите, чтобы «видеть» «\r\n» в результатах, вы будете иметь, чтобы избежать их с String.Replace().

См Fiddle Demo

+0

Это отлично работает! только это не захватывает новые строки. Можно ли сделать это? – ExceptionLimeCat

+0

@ExceptionLimeCat Что значит, что он не захватывает новые строки? Посмотрите на ссылку Regex101. Первый матч имеет захваченные новые строки. – Shar1er80

+0

Это матч, но они разобрались в матче? Имеет ли это смысл? Я не вижу никаких «\ r \ n' в совпадающем тексте – ExceptionLimeCat

Смежные вопросы