web-dev-qa-db-ja.com

PCRE正規表現はヌル文字と一致しますか?

Nullを含むテキストソースがあり、正規表現パターンと一緒にnullを引き出す必要があります。正規表現はヌル文字にも一致しますか?

パターンが一致することを拒否し、Notepad ++に貼り付けたときに、すべてのヌル文字が表示されたときにのみ、それらがあることに気付きました。

26
Keng
\x00

それはヌル文字です。

43
aaaaaaaaaaaa

ヌル文字の照合に関する問題の1つは、最初にヌル文字を到着させるように手配する必要があることです。多くの言語ではnullで終了する文字列が使用されているため、入力全体と一致しない場合があります。

PCREで表現する方法については、\ 000が機能し、\ x {}のようにそれに続くものによってつまずくことはありません(ただし、正規表現をスキミングするときに8進数バージョンの方が識別しやすいと思います)。

さまざまな方法でnullを指定する方法の詳細については、 PCREマンページ を参照し、非印刷文字を検索してください。 。

2
ChrisF

前の回答に別の詳細を明確にする/追加するには:PCREライブラリはパターンを「C」のヌル終了文字列として受け入れます。 (PCREドキュメントの引用:「パターンはバイナリゼロで終了するC文字列です」。)つまり、パターンにリテラルNUL文字を含めることはできません。代わりに、他の回答で説明されている手段を使用して常にエスケープする必要があります。 ( "パターン文字列とは異なり、サブジェクトにはバイナリゼロが含まれる場合があります。" "4.バイナリゼロ文字はサブジェクト文字列でサポートされていますが、通常のC文字列として渡され、終了するため、パターン文字列では使用できません。ゼロで。エスケープシーケンス\ 0をパターンで使用して、バイナリゼロを表すことができます。 ")

NUL文字は、エスケープする必要があるPCREパターン内の唯一の文字であり、他のすべての文字はリテラルになる可能性があります。「パターンを終了するバイナリゼロを除いて、非印刷文字の外観に制限はありません」。

最後の比較メモとして、他のいくつかのPerl互換正規表現エンジンでは、PythonのSREなどのパターンでリテラルNULを使用できます。例えば。 Python3のurlib.parseには次の行があります:_asciire = re.compile('([\x00-\x7f]+)')。生のリテラルを表す「r」がないことに注意してください。これは、ここでエスケープ解除がPythonレベルで発生し、reモジュールがパターンで値0x00および0x7fの文字を取得することを意味します。

2
pfalcon