2013-03-07 2 views
5

У меня есть регулярное выражение, которое я проверил в трех отдельных источниках, успешно совпадающих с нужным текстом.C# Regex Pattern Conundrum

  1. http://regexlib.com/RETester.aspx
  2. http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx,
  3. http://sourceforge.net/projects/regextester/

Но, когда я использую регулярное выражение в моем коде. Это не дает соответствия. Я использовал другое регулярное выражение с этим кодом, и они привели к желаемым совпадениям. Я в недоумении ...

string SampleText = "starttexthere\r\nothertexthereendtexthere"; 
string RegexPattern = "(?<=starttexthere)(.*?)(?=endtexthere)"; 
Regex FindRegex = new Regex(@RegexPattern); 
Match m = FindRegex.Match(SampleText); 

Я не знаю, является ли проблема в моем регулярном выражении или в моем коде.

ответ

7

Проблема заключается в том, что ваш текст содержит \r\n, что означает, что он разделен на две линии. Если вы хотите, чтобы соответствовать всей строке, которую вы должны установить option, чтобы соответствовать по нескольким линиям, и изменить поведение . включить (символ новой строки) \n в соответствии

Regex FindRegex = new Regex(@RegexPattern, RegexOptions.Multiline | RegexOptions.Singleline); 
+0

Пробовал уже. Regex.Match (SampleText, @RegexPattern, RegexOptions.Multiline) .Groups [1] .Value.ToString() возвращает пустую строку – s15199d

+0

, что если вы включите RegexOptions.Multiline | RegexOptions.Singleline, а также –

+0

Спасибо Мики! Для этого нужны как многострочные, так и однострочные. – s15199d

0

Вы надеваете» t необходимо RegexOptions.Multiline.

Проблема в вашем случае состоит в том, что точка соответствует любому символу, кроме символов разрыва строки (\r\ и \n).

Итак, вы должны определить свой шаблон регулярного выражения так: (?<=starttexthere)[\w\r\n]+(?=endtexthere), чтобы точно соответствовать тексту через разрывы строк.

Вот онлайн работает пример: http://ideone.com/ZXgKar

+0

Это не соответствует в соответствии с http://regexlib.com/RETester.aspx – s15199d

+0

@ s15199d да, это *. * Соответствует. Кроме того, код в идеонной ссылке работает. – GolfWolf