Regex для исключения не-ASCII, но оставить символы Nordi c - PullRequest
1 голос
/ 21 апреля 2020

У меня есть макрос, в котором я использую Regex для удаления текста всех символов, не относящихся к ASCII (для создания имен папок).

Я относительно новичок в Regex, и мне было интересно, как убрать все символы, не относящиеся к ASCII, но при этом включить символы Nordi c, поскольку макрос проходит через скандинавские данные. По сути, мне нужно было бы включить символы от 128 до 165 из этой таблицы

Вот мой код:

Public Function GetStrippedText(txt As String) As String
    Dim regEx As Object

    Set regEx = CreateObject("vbscript.regexp")
    regEx.Pattern = "[^\u0000-\u007F]"
    GetStrippedText = regEx.Replace(txt, "")

End Function

Я понимаю что мне нужно как-то включить этот диапазон "[^\u0000-\u007F]", я просто не знаю, где найти связанный код или как его включить.

1 Ответ

1 голос
/ 21 апреля 2020

Насколько я знаю, я думаю, что здесь есть несколько моментов, которые следует выделить:

  • Не все расширенные (или не) таблицы ASCII следуют той же кодировке символов. Таблица, которую вы связали, похоже, следует за CP437, а Excel следует за UTF-8 (Unicode), который вы можете протестировать с помощью функции UNICODE в Excel. Здесь - ссылка, чтобы увидеть разницу, которую он вносит в шестнадцатеричные коды. Таким образом, вам, скорее всего, нужно выбрать интересующий вас диапазон в «Приложении Latin-1», который можно найти здесь . В этом упражнении я использовал символы из À-ÿ в диапазоне: u00C0-\u00FF

  • Далее, ваш текущий класс символов охватывает обычные символы ASCII, однако я полагаю, что вас может заинтересовать только 0020-007F поскольку вы, вероятно, не хотите включать 0000-001F.

  • В-третьих, вы не установили для параметра Global значение True, что означает, что ваш текущий UDF будет только замените первый символ, который он находит за пределами вашего класса символов. Поэтому вам нужно установить этот параметр для замены всех символов вне определенного класса символов.

Итак, в заключение, нижеприведенное может работать для вас:

Public Function GetStrippedText(txt As String) As String
    Dim regEx As Object

    Set regEx = CreateObject("vbscript.regexp")
    regEx.Global = True
    regEx.Pattern = "[^\u0020-\u007F\u00C0-\u00FF]"
    GetStrippedText = regEx.Replace(txt, "")

End Function

Для вашего понимания; [^\u0020-\u007F\u00C0-\u00FF] означает:

  • [....] - в скобках указано, что это класс символов
  • ^ - каретка означает, что это отрицательный класс символов
  • \u0020-\u007F - означает, что символы идут от индекса 32 до индекса 127 , а \u00C0-\u00FF - от 192 до 255.

Таким же образом вы можете увеличить количество диапазоны символов.


Примечание 1: Вместо Unicode вы также можете просто использовать шестнадцатеричные коды: "[^\x20-\x7F\xC0-\xFF]"

Примечание 2: Вы также можете создать класс символов без диапазонов Unicode или Hex. Вместо этого просто объедините интересующие вас персонажи.

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