регулярное выражение $ в .net framework - PullRequest
1 голос
/ 06 мая 2009

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

Спасибо Фред

        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();
        }

Ответы [ 3 ]

4 голосов
/ 06 мая 2009

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

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

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

0 голосов
/ 06 мая 2009

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

string sourceText = "ab\nab\nab";

или

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

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

0 голосов
/ 06 мая 2009

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

Я подозреваю, что вы хотите что-то вроде этого:

b(?=(?:<br />)?\r?$)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...