RegexOptions

25 мая 2011 г. | | |

Есть файл с содержимым вида

<Book>
   <Page number='1'><![CDATA[line1
                                line2
                                line3]]>
   </Page>
   <Page number='2'><![CDATA[line1]]>

   </Page>
</Book>


Нужно распарсить содержимое через RegExpr. Вроде ничего сложного. Тест для класса PageParser должен срабатывать:

//PageParser
class PagePaerser
{
  public static IList<Page> Parse(string xml)
  {
     IList<Page> pages = new List<Page>();
     string pattern = "<Page number='(?<number>\\d*?)'><\\!\\[CDATA\\[(?<content>.*?)\\]\\]><\\/Page>";
     var matches = Regex.Matches(xml, pattern, RegexOptions.IgnoreCase | RegexOptions.Multiline);
     if (matches.Count>0)
     {
        foreach(Match match in matches)
        {
            pages.Add(new Page()
            {
              content = match.Groups["content"].Captures[0].Value,
              number = int.Parse(match.Groups["number"].Captures[0].Value)
           });
        }
    }
    return pages;
  }
}


[TestMethod]
public void ParseMethod_ListOfPages_Test()
{
   var parsed_pages = PageParser.Parse(@"
<Book>
      <Page number='1'><![CDATA[line1
                                  line2
                                  line3]]>
      </Page>
      <Page number='2'><![CDATA[line1]]>

      </Page>
   </Book>

");
   Assert.AreEqual(2, parsed_pages.Count);
}

Но тест не срабатывает. Дело в том, что в RegExpr для обработки multiline-строк, нужно вместо флага RegexOptions.Multiline устанавливать RegexOptions.Singleline, который меняет режим символа "." на улавливание совпадений со всеми символами, а не всех символов, кроме новой строки (\n)

0 коммент.:

Отправить комментарий