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

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

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


person Keng    schedule 05.04.2010    source источник


Ответы (3)


\x00

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

person aaaaaaaaaaaa    schedule 05.04.2010
comment
Спасибо. отлично работает, но просто не может заставить ни один из моих «визуальных» инструментов работать с нулем, но Grep Regex Buddy сделает это за кулисами. - person Keng; 06.04.2010
comment
Не следует делать \x0, если только это не единственное, что вам нужно. если вы пытались сопоставить \x0apple, это попытается сопоставить с \npple - person Augwa; 14.07.2017

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

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

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

person ChrisF    schedule 05.02.2013

Чтобы уточнить/добавить еще одну деталь к предыдущему ответу: библиотека 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 в шаблоне.

person pfalcon    schedule 23.05.2014