Ошибки обработки маркера через регулярное выражение в VB для очистки XML-файла - PullRequest
1 голос
/ 21 декабря 2010

Я пытаюсь очистить XML-файл, чтобы в нем были только символы UTF-8, но у меня возникли проблемы с маркером.В файлах есть точка маркера, и если я удаляю эти символы, остальная часть замены регулярного выражения работает нормально, но, похоже, она не заменяет этот конкретный символ маркера.Глядя на HEX, это 0x07, а в Unicode / u0007, но ни один из них не разрешил ошибку («шестнадцатеричное значение 0x07, это недопустимый символ»)

- вот часть кода замены регулярного выражения (VB-скрипт в SSIS)Я использую несколько итераций, которые я пробовал.Любая помощь будет принята с благодарностью.

    XMLString = FileIO.FileSystem.ReadAllText(filelocation)
    'Dim rgx As Regex = New Regex("[\x00-\x08\x0B-\x0C\x0E-\x1F\u0000-\u0007]", RegexOptions.None)
    'Dim rgx As Regex = New Regex("[^0-9a-zA-Z]", RegexOptions.None)
    'Dim rgx As Regex = New Regex("[[:^print:]]", RegexOptions.None)
    'Dim rgx As Regex = New Regex("[[:^print:][\u0007]]", RegexOptions.None)
    Dim rgx As Regex = New Regex("[^\x09\x0A\x0D\x20-\xD7FF\xE000-\xFFFD\x10000-x10FFFF]", RegexOptions.None)
    'Dim rgx As Regex = New Regex("[\x00-\x1F\x7F-\xFF]+", RegexOptions.None)
    rgx.Replace(XMLString, "")

спасибо

1 Ответ

0 голосов
/ 12 апреля 2011

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

  • Если вы работаете с байтами, вам следует использовать только escape-последовательности \xXX.(и XX может состоять только из 2 "цифр")
  • Если вы работаете с символами, вам следует использовать escape-последовательности \uXXXX (\ xXXXX - это то же самое в большинстве языков)

Глядя на свое некомментированное регулярное выражение, кажется, что вы смотрите на персонажей.Это означало бы, что файл уже должен быть в какой-то допустимой кодировке символов (возможно, в одной из UTF-8, UTF-16LE или cp1252).Таким образом, все, что делает это регулярное выражение, удаляет допустимые символы UTF-8, которые не разрешены согласно спецификации XML.http://www.w3.org/TR/xml/#charsets.Это должно быть хорошо.

Но если ваша строка представляет собой поток байтов, и вы пытаетесь убедиться, что это допустимый UTF-8, то это сложнее сделать с регулярным выражением.Кроме non-ascii, я не знаю как.

Еще один момент: не следует ли вам устанавливать глобальный атрибут вашего регулярного выражения перед заменой.Может ли это быть вашей проблемой?Это исправить первый случай, но не весь файл?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...