いくつかの正規表現コマンドが他の文字に対して「\」を逆に解釈するのはなぜですか?

いくつかの正規表現コマンドが他の文字に対して「\」を逆に解釈するのはなぜですか?

次のコマンドを例に挙げます。

find . -regex ".*\.\(cpp\|h\)"

これにより、ディレクトリ内のすべての.hファイルと.cppファイルが検索されます。ピリオド文字「.」は通常、正規表現の「すべての文字」を意味します。実際のピリオドだけを一致させるには、バックスラッシュ文字 "\"でエスケープする必要があります。

この場合、特別な意味を持つ文字が与えられた場合、その文字が表す実際の文字を取得するには、その文字をエスケープする必要があります。

今、それぞれ「(」、「)」、「|」文字の括弧と「or」列を使用します。また、特別な意味を持ち、正規表現をグループ化するためにも使用されます。しかし、特別な意味を得るためには、バックスラッシュを使って文字をエスケープする必要があります!バックスラッシュがない場合、これらの文字はその文字が表す実際の文字の意味を持ちます。

'.' が '(', ')' および '|' と異なるように処理されるのはなぜですか?

ベストアンサー1

答えは実際に「ただ」です。さまざまな正規表現構文があり、形状が似ており、通常は基本は同じですが、詳細では異なります。

歴史的に、各ツールには、作成者が最も良いと思ったタスクを実行する独自の新しい実装がありました。文字を特別にするもの(エスケープを含めるかどうか)の間にはバランスがあります。 「自然に特別な」文字が多すぎるため、一致させるには常に文字をエスケープする必要があります。 ()グループ化などの一般的な正規表現構文を使用するようにエスケープします。プログラムを書くすべての人は、自分のプログラムに合った要件、正しいアプローチだと思うこと、月の位相に応じて何をするかを決定します。

POSIXは標準化を試みています」基本正規表現「そして」拡張正規表現\驚くべきことに、これらの努力は次の点で逆さまに機能します。時々しかし、完璧な一貫性ではありません。

Perl正規表現は、2つの理由で別の事実上の標準になりました。まず、非常に柔軟で強力で、第二に、実際にはとても賢い、「\は常に英数字ではなく文字をエスケープします」などの規則を使用します。

GNU Findには、-regextype使用される正規表現構文を変更するオプションがあります。残念ながら、perlは少なくとも私のバージョンのfindではオプションではありません。 (GNUのデフォルトは「emacs」ですが、これは驚くべきことではありません。構文は次のとおりです。ここに録音してください.)

おすすめ記事