2009-05-06 2 views
1

Я пытаюсь проверить регулярное выражение $ anchor с использованием .net framework, результат является неожиданным. $ Anchor возвращает только последний. Я отмечаю, что многострочный переключатель важен, и я уже использовал его здесь. Может кто-нибудь сказать причину. Ниже приведен мой тестовый код

Благодаря Фред

 string sourceText = 
@"ab<br /> 
ab<br /> 
ab"; 

     //var m = Regex.Match(sourceText, "^a", RegexOptions.Multiline); //this return 3 match 
     var m = Regex.Match(sourceText, "b$", RegexOptions.Multiline); //this return only one match 
     while (m.Success) 
     { 
      Console.Write(m.Value); 
      m = m.NextMatch(); 
     } 

ответ

4

$ матчи \n только не \r\n (как ваша строка при использовании C# буквального в текстовом файле Windows).

Регулярное выражение b(?=\r?$) будет делать то, что вы ожидаете.

См. http://msdn.microsoft.com/en-us/library/h5181w5w.aspx с объяснением.

0

Есть две причины, по которым это не работает. Поскольку Лусеро говорит, что соответствие $ будет соответствовать только фиду линии, а ваша тестовая строка имеет ответ на резкость, а также линию в конце каждой строки. Вторая причина заключается в том, что вы пытаетесь сопоставить b в конце строки, и ваша тестовая строка содержит только одну строку, которая соответствует этому требованию, первые две строки заканчиваются на>.

То, что я подозреваю, что вы хотите что-то больше, как это:

b(?=(?:<br />)?\r?$) 
0

Там, кажется, некоторые coufusion о том, что именно вы претендуете на регулярное выражение. Как он появился в вашем исходном сообщении, строковый литерал, казалось, имел в нем буквальные символы новой строки (которые даже не были скомпилированы), которое программное обеспечение SO заменено на теги <BR>. Если вы хотите, строка содержит символы новой строки, вы должны использовать соответствующие управляющие последовательности, например, так:

string sourceText = "ab\nab\nab"; 

или

string sourceText = "ab\r\nab\r\nab"; 

В любом случае, регулярное выражение b$должен матч все три Б когда применяется в многострочном режиме. Я не настроен, чтобы проверить его сам, но если $ действительно соответствует только \n, так как MSDN article говорит, что я рассматривал бы его как серьезный недостаток в регулярных выражениях .NET. Учитывая последовательность \r\n, $ должен соответствовать до \r, а не до \n.

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