Подтвердить что ты не робот

Может ли регулярное выражение PCRE соответствовать нулевому символу?

У меня есть источник текста с нулями в нем, и мне нужно вытащить их вместе с моим шаблоном регулярного выражения. Может ли регулярное выражение соответствовать нулевому символу?

Я только понял, что имел их, когда мой шаблон отказался сопоставляться, и когда я вложил его в Notepad ++, он показал все нулевые символы.

4b9b3361

Ответ 1

\x00

Это значение null char.

Ответ 2

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

Как выражать это в PCRE,\000 работает и не собирается расцепляться ничем, следующим за ним, равно как и \x {} (но восьмеричная версия, на мой взгляд, легче идентифицировать при сглаживании регулярного выражения).

См. файлы PCRE и найдите Непечатаемые символы для получения полной информации о том, как указать нуль различными способами.

Ответ 3

Чтобы уточнить/добавить еще одну деталь к предыдущему ответу: библиотека PCRE принимает шаблон как строку с нулевым завершением "C". (Цитирование документов PCRE: "Шаблон - это строка C, завершаемая двоичным нулем".) Это означает, что шаблон не может содержать буквенный символ NUL - вместо этого он всегда должен быть экранирован с использованием средств, описанных в других ответах. ("В отличие от строки шаблона, объект может содержать бинарные нули. "4. Хотя двоичные нулевые символы поддерживаются в строке темы,      они не допускаются в строке шаблона, потому что они передаются как ни-      mal C, заканчивается нулем. Эквивалентная последовательность \0 может быть использована в      шаблон для представления двоичного нуля." )

Символ NUL является единственным символом в шаблоне PCRE, который должен быть экранирован, а все остальные могут быть буквальными: "Нет ограничений на      появление непечатаемых символов, кроме двоичного нуля, что      завершает шаблон".

В качестве окончательного сравнительного примечания некоторые другие Perge-совместимые механизмы регулярных выражений допускают литературные NUL в шаблоне, например Python SRE. Например. urlib.parse из Python3 имеет следующую строку: _asciire = re.compile('([\x00-\x7f]+)'). Обратите внимание на отсутствие "r" для обозначения необработанного литерала - это означает, что здесь происходит несобранение на уровне Python, а модуль re получает символы со значениями 0x00 и 0x7f в шаблоне.