Regex для удаления объявления xml из строки - PullRequest
4 голосов
/ 08 ноября 2010

Прежде всего, я знаю, что это плохое решение, и я не должен этого делать.

Фон: не стесняйтесь пропускать


Однако мне нужно быстрое исправление для работающей системы. В настоящее время у нас есть структура данных, которая сериализуется в строку путем создания фрагментов "xml" с помощью ряда конструкторов строк. Является ли это действительным XML, я скорее сомневаюсь. После создания этого xml и перед его отправкой по очереди сообщений некоторый код очистки ищет в строке вхождения объявления xml и удаляет их.

Способ, которым это делается (итерация каждого символа, выполняющего indexOf для <?xml), настолько медленен, что вызывает тайм-ауты потоков и убивает наши системы. В конечном счете, я попытаюсь исправить это правильно (создайте xml, используя документы xml или что-то подобное), но на сегодня мне нужно быстрое исправление, чтобы заменить то, что там есть.

Пожалуйста, имейте в виду, я знаю, что это далеко не идеальное решение, но мне нужно быстрое решение, чтобы вернуть нас к работе.


Вопрос

Я думал использовать регулярные выражения, чтобы найти объявления. Я планировал: <\?xml.*?>, затем с помощью Regex.Replace(input, string.empty) удалить.

Не могли бы вы сообщить мне, есть ли какие-либо явные проблемы с этим регулярным выражением, или лучше просто написать его в коде, используя пары string.IndexOf("<?xml") и string.IndexOf("?>") в (гораздо более разумном) цикле.

EDIT Мне нужно позаботиться о переводе строк.

Будет ли: <\?xml[^>]*?> сделать трюк?

EDIT2

Спасибо за помощь. Regex мудрый <\?xml.*?\?> работал нормально. В итоге я написал некоторый временной код и протестировал как ar egex, так и IndexOf(). Я обнаружил, что для нашего простейшего варианта использования, просто удаление объявления заняло:

  • Почти секунда, как это было
  • .01 секунды с регулярным выражением
  • невозможно использовать с помощью цикла и IndexOf()

Итак, я выбрал IndexOf(), так как это очень простой цикл.

Ответы [ 2 ]

6 голосов
/ 08 ноября 2010

Вы, вероятно, хотите либо это: <\?xml.*\?>, либо это: <\?xml.*?\?>, потому что, как у вас сейчас, регулярное выражение ищет не «?>», А просто «>». Я не думаю, что вам нужен первый вариант, потому что он жадный и удалит все между первым появлением ''. Второй вариант будет работать до тех пор, пока у вас нет вложенных XML-тегов. Если вы это сделаете, он удалит все между первым ''. Если у вас есть другой тег ''.

Кроме того, я не знаю, как регулярные выражения реализованы в .NET, но я серьезно сомневаюсь, что они быстрее, чем при использовании indexOf.

0 голосов
/ 19 января 2016
strXML = strXML.Remove(0, sXMLContent.IndexOf(@"?>", 0) + 2);
...