Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: KengОтветов: 3

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

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

nullregexpcre

Ответы

Ответ 1 · рейтинг 47 · aaaaaaaaaaaa

\x00

Это нулевой символ.

Ответ 2 · рейтинг 2 · ChrisF

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

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

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

Ответ 3 · рейтинг 2 · pfalcon

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

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы