Как сопоставить и удалить символ обратной косой черты «\» и «\ n» с помощью библиотеки .NET Regex? - PullRequest
3 голосов
/ 28 января 2010

Я получаю XML от веб-службы в следующем формате и хочу очистить его (удалить лишние символы «\» и «\ n») перед началом работы с ним. В настоящее время я использую регулярное выражение ниже, чтобы соответствовать. Однако очищаются только символы "\ n", а символы "\", которые находятся между одинаковыми и двойными кавычками, сохраняются.

Что вы мне посоветуете сделать?

private string ValidateXml(string dirtyXml) {
    Regex regex = new Regex(@"[\\\][\n]");
    var cleanXml = regex.Replace(dirtyXml, "");
    return cleanXml;
}

"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n<ISBNdb server_time=\"2010-01-28T11:31:08Z\">\n<BookList total_results=\"1\" page_size=\"10\" page_number=\"1\" shown_results=\"1\">\n<BookData book_id=\"quantitative_techniques\" isbn=\"0826458548\" isbn13=\"9780826458544\">\n<Title>Quantitative techniques</Title>\n<TitleLong></TitleLong>\n<AuthorsText>Terry Lucey</AuthorsText>\n<PublisherText publisher_id=\"continuum\">London : Continuum, 2002.</PublisherText>\n</BookData>\n</BookList>\n</ISBNdb>\n"

Ответы [ 4 ]

3 голосов
/ 28 января 2010

Вопрос все еще неясен: если вы записываете строку XML (прежде чем пытаться ее очистить) в консоль, видите ли вы именно то, что вы опубликовали выше, со всеми этими последовательностями \" и \n? Отображаемая строка начинается и заканчивается кавычкой? Если это так, вы, вероятно, захотите удалить открывающие и закрывающие кавычки и все обратные косые черты, и если за любой обратной косой чертой следует символ «n», вы также хотите удалить ее. Вот некоторый код для демонстрации:

static void Main(string[] args)
{
  string dirtyXml = @"""<?xml version=\""1.0\"" encoding=\""UTF-8\""?>\n\n<ISBNdb server_time=\""2010-01-28T11:31:08Z\"">\n<BookList total_results=\""1\"" page_size=\""10\"" page_number=\""1\"" shown_results=\""1\"">\n<BookData book_id=\""quantitative_techniques\"" isbn=\""0826458548\"" isbn13=\""9780826458544\"">\n<Title>Quantitative techniques</Title>\n<TitleLong></TitleLong>\n<AuthorsText>Terry Lucey</AuthorsText>\n<PublisherText publisher_id=\""continuum\"">London : Continuum, 2002.</PublisherText>\n</BookData>\n</BookList>\n</ISBNdb>\n""";
  Console.WriteLine(dirtyXml);
  Console.WriteLine();
  Console.WriteLine(Regex.Replace(dirtyXml, @"^""|""$|\\n?", ""));
}

выход:

"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n<ISBNdb server_time=\"2010-01-28T11:31:08Z\">\n<BookList total_results=\"1\" page_size=\"10\" page_number=\"1\" shown_results=\"1\">\n<BookData book_id=\"quantitative_techniques\" isbn=\"0826458548\" isbn13=\"9780826458544\">\n<Title>Quantitative techniques</Title>\n<TitleLong></TitleLong>\n<AuthorsText>Terry Lucey</AuthorsText>\n<PublisherText publisher_id=\"continuum\">London : Continuum, 2002.</PublisherText>\n</BookData>\n</BookList>\n</ISBNdb>\n"

<?xml version="1.0" encoding="UTF-8"?><ISBNdb server_time="2010-01-28T11:31:08Z"><BookList total_results="1" page_size="10" page_number="1" shown_results="1"><BookData book_id="quantitative_techniques" isbn="0826458548" isbn13="9780826458544"><Title>Quantitative techniques</Title><TitleLong></TitleLong><AuthorsText>Terry Lucey</AuthorsText><PublisherText publisher_id="continuum">London : Continuum, 2002.</PublisherText></BookData></BookList></ISBNdb>

Точно ли это отражает то, с чего вы начинаете и чем хотите закончить?

1 голос
/ 28 января 2010

Ваше регулярное выражение немного странно, оно будет соответствовать следующему:

  • \\ одиночный символ обратной косой черты
  • \[ одиночный [символ
  • ] одиночный] символ
  • \n символ новой строки

Следующее регулярное выражение будет соответствовать тому, что вы описали:

@"\\n?"

Соответствует буквальному \n или \. Обратите внимание, что обратный слеш будет совпадать, даже если за ним не следует кавычка. Чтобы соответствовать только обратным слешам, за которыми следует кавычка, вы можете использовать этот шаблон:

@"(\\n)|(\\(?=""))"
0 голосов
/ 28 января 2010

Похоже, вы хотите | в этом коде сказать совпадение либо \ n, либо \

Попробуйте это

[\\][n]|[\\]
0 голосов
/ 28 января 2010

Для этого вам не нужно регулярное выражение, вы можете просто использовать пару вызовов String.Replace.

Это должно сработать:

var cleanXml = dirtyXml.Replace("\\n", "").Replace("\\\"", "\"");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...