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

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

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


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


Ответы (3)


arrow_upward
47
arrow_downward

\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

arrow_upward
2
arrow_downward

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

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

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

person ChrisF    schedule 05.02.2013

arrow_upward
2
arrow_downward

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