Может ли регулярное выражение PCRE соответствовать нулевому символу? - PullRequest
25 голосов
/ 06 апреля 2010

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

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

Ответы [ 3 ]

43 голосов
/ 06 апреля 2010
\x00

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

2 голосов
/ 23 мая 2014

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

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

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

2 голосов
/ 05 февраля 2013

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

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

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

...