Шаблон регулярного выражения не работает - PullRequest
1 голос
/ 28 апреля 2010

Я пытаюсь найти подстроку от начала строки до точки, которая имеет escape-последовательность "\r\n\r\n" мое регулярное выражение Regex completeCall = new Regex(@"^.+?\r\n\r\n", RegexOptions.Compiled);, оно прекрасно работает, пока у вас есть только строки типа 123\r\n\r\n, однако, как только вы иметь шаблон 123\r\n 456\r\n\r\n шаблон больше не соответствует.

Любой совет, что я делаю не так?

Regex completeCall = new Regex(@"^.+?\r\n\r\n", RegexOptions.Compiled);
Regex junkLine = new Regex(@"^\D", RegexOptions.Compiled);
private void ClientThread()
{
    StringBuilder stringBuffer = new StringBuilder();
    (...)
    while(true)
    {
        (...)
        Match match = completeCall.Match(stringBuffer.ToString());
        while (Match.Success) //once stringBuffer has somthing like "123\r\n  456\r\n\r\n" Match.Success always returns false.
        {
            if (junkLine.IsMatch(match.Value))
            {
                   (...)
            }
            else
            {
                   (...)
            }
            stringBuffer.Remove(0, match.Length); // remove the processed string
            match = completeCall.Match(stringBuffer.ToString()); // check to see if more than 1 call happened while the thread was sleeping.
        }
        Thread.Sleep(1000);
    }

Изменить здесь данные, которые вызывают его сбой (\ r \ n переведены в настоящие разрывы строк)

691  25 2102   7:29     1:12      3585551234                                  A --Matches fine

692  27 2102   7:29     0:39      2155555432                                  A --Regex will not match this line when it comes up.
  *     2190            0:31                                               ABN  

693  28 2102   7:30     0:23      3055551212                                  A --never gets here because it is stuck on the previous line.

Ответы [ 2 ]

1 голос
/ 28 апреля 2010

. в вашем регулярном выражении не соответствует разрывам строк. Вам нужно указать опцию RegexOptions.Singleline, чтобы исправить это.

Почему-то я думаю, что vfilby действительно имел в виду эту опцию. =)

0 голосов
/ 28 апреля 2010

Шаблон ^.+?\r\n\r\n соответствует строке 123\r\n\r\n, поскольку 123 не содержит разрывов строк (по умолчанию . не соответствует \n в .NET). Чтобы ваш шаблон также совпадал с 123\r\n 456\r\n\r\n, включите опцию DOT-ALL:

`(?s)^.+?\r\n\r\n`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...