Shell globが正規表現の「方言」と見なされないのはなぜですか? [コピー]

Shell globが正規表現の「方言」と見なされないのはなぜですか? [コピー]

私はしばしばBash 3.xシェルグローバル変数を使用します。

?      # Match any single character.
*      # Match any string of characters (up until the asterisk).
[set]  # Match any character in set (but not the entire set itself).
[!set] # Match any character not in set.

正規表現を使用してください(特にポリメラーゼ連鎖反応)。

私の質問は、なぜ「Bash正規表現」(例:「JavaScript正規表現」)と見なされないのですか?

正規表現のもう一つの「方言」と考えたらどうでしょうか?

もちろん、これは非正統的なことでしょうが、そうしないでください公式の論理的な理由があるかどうかはわかりません。

ベストアンサー1

ファイル名のグロービングパターンと正規表現にはいくつかの構文が重なりますが、基本的には異なる動作をします。

正規表現はe文字列と一致しますhelloが、ファイル名のワイルドカードパターンはe一致しません。ワイルドカードパターンは暗黙的に固定されるため、ワイルドカードパターンは正規表現と同じeように見えます^e$が、適用方法は異なる場合があります(正規表現は全文行と一致しますが、ワイルドカードパターンは通常単一のファイル名と一致します)。

*ファイル名globbingパターンには、正規表現などの前の式を限定する特殊文字や正規表現など、式の一部をグループ化するツールや式の一部をグループ化するツールもありません。可能なサブパターンを交互に使用するツールは正規表現にあります。一部のシェルは、アクティブな場合など、明らかにこれらのいくつかを追加します。?(...)|bashshopt -s extglob

ワイルドカードパターンは正規表現とは異なる用途に使用されます。正規表現は次のとおりです。主にテキスト内の文字列を選択/一致しますが、ファイル名のワイルドカードパターンは次のとおりです。主に(ただしこれに限定されない)ファイル名を一致させるため、またはディレクトリから既存の名前のリストを生成するために使用されます。一致にはワイルドカードパターンが使用されます。ひもたとえばcase ... esac、POSIXシェルは、正規表現を使用してディレクトリから名前のリストを生成しない限り、絶対に使用しません。拡大するこのような能力を持ってください。

どちらのタイプのスキーマも POSIX 標準によって定義されます。

ワイルドカードパターンの場合、標準はまず次のように言います。

このセクションで説明されているパターンマッチング表記は、文字列に一致するシェルのパターンを指定するために使用されます。歴史的に、パターンマッチング表記はXBD正規表現で説明されている正規表現表記と関連していますが、わずかに異なります。。したがって、このパターン一致表記の規則は次のように説明されます。に基づいて違いを説明するために修正された正規表現表記の説明。

言及したPCREのような正規表現にはいくつかの「方言」がありますが、ファイル名のグロービングパターンは実際にはそれらの1つとは言えません。

SQLクエリで使用されるように、シェルのファイル名のグロービングパターンに似た複数のパターン言語がありますLIKE。これは非常に簡単で、文字列ビットを一致させる便利な方法で提供されることがよくあります。これに対して正規表現ははるかに複雑です。


bash「正規表現」に言及しました。bashシェルする正規表現はサポートされますが、ファイル名の一致はサポートされません。演算子[[ ... ]]は、=~左側の文字列と右側の正規表現に対して正規表現の一致を実行します。このようにシェルがサポートする正規表現型は、bash正規表現拡張の標準セットです。詳しくは、bashシステムのマニュアルを参照してください。

おすすめ記事