Почему это регулярное выражение находит соответствие для \ x63 с шаблоном

Я пытаюсь фильтровать допустимые / недопустимые байты UTF-8, но я получаю странные результаты из следующего регулярного выражения (которое предназначено для обработки 3-байтовой формы UTF-8).

Я предполагал, что шаблон не должен соответствовать тестовым байтам '\xE0\xA1\x63' , но он …
Что мне не хватает?

 showmatch() { echo -ne " --> " echo -ne "$bytes" | # strip whitespace from the pattern perl -l -ne '/^'${1// /}'$/x and print' | tr -d '\n' | xxd -p | tr -d '\n' echo; } bytes='\xE0\xA1\x63' echo -n "before: "; echo -ne "$bytes" |xxd -p # Note: all whitespace is stripped from each regex pattern. # Bytes 1 and 2 and 3 # (---------------------------------------------------------------------------------------------------) # Bytes 1 and 2 # (------------------------------------------------------------------------------) # [byt1][byt2-----] | [byt1][byt2-----] | [byte-1------------][byt2-----] [byt3----] # ================= ================= =============================== ========== showmatch '( ( ([\xE0][\xA0-\xBF]) | ([\xED][\x80-\x9F]) | ([\xE1-\xEC\xEE-\xEF][\x80-\xBF]) ) ([\80-\xBF]) )' # # witout spaces: showmatch '((([\xE0][\xA0-\xBF])|([\xED][\x80-\x9F])|([\xE1-\xEC\xEE-\xEF][\x80-\xBF]))([\80-\xBF]))' # exit 

Вот результат

 before: e0a163 --> e0a163 --> e0a163 

2 Solutions collect form web for “Почему это регулярное выражение находит соответствие для \ x63 с шаблоном”

Похоже, вы забыли x в последней части регулярного выражения:

 [\80-\xBF] --> [\x80-\xBF] 

Вы заметили ошибку, хорошо. Теперь было бы полезно выявить подобные ошибки или избежать их в будущем.

Вы уже применили модификатор x Perl к операторам regexp, который позволяет иметь пробелы в регулярных выражениях. Ваша соответствующая конструкция будет написана с помощью новых строк (что позволит добавлять комментарии).

 /( ( ([\xE0][\xA0-\xBF]) | ([\xED][\x80-\x9F]) | ([\xE1-\xEC\xEE-\xEF][\x80-\xBF]) ) ([\80-\xBF]) )/x 

или без круглых скобок, которые здесь не нужны:

 /([\xE0][\xA0-\xBF]| [\xED][\x80-\x9F]| [\xE1-\xEC\xEE-\xEF][\x80-\xBF]) [\80-\xBF] /x 

Я считаю, что недостающее x выделяется больше.

  • Как удалить русские и арабские строки из текстового файла
  • Как заменить все подстрочные индексы UTF-8 с процентным кодированием на простой текст UTF-8?
  • Изменение шрифтов в приложении терминала Mate
  • консоль, отображающая символ цитаты из gcc wongly
  • Как изменить шрифт консоли bash для отображения символов UTF-8
  • Почему printf «сжимает» умлаут?
  • gnome-terminal unicode chars не отображается - для локали установлено значение en_US.utf8
  • Неверная сортировка по en_US.UTF-8
  • Есть ли альтернатива sed, которая поддерживает unicode?
  • Шведские символы юникода в xdm / xlogin
  • Unicode (проблема Bengali-unijoy (m17n)
  • Linux и Unix - лучшая ОС в мире.