一致式に正規表現リテラルを作成するには?

一致式に正規表現リテラルを作成するには?

この質問は正規表現を書く正しい方法についてです。言葉bashで一致する式で。

zsh では、期待どおり次の一致が成功します。

% [[ ' 123 ' =~ '^ [0-9]+ $' ]]; echo $?
0

Bashではそうではありません。

$ [[ ' 123 ' =~ '^ [0-9]+ $' ]]; echo $?
1

私はこのゲームがbashでうまく動作することを知っています。

$ ( regexp='^ [0-9]+ $'; [[ ' 123 ' =~ $regexp ]]; echo $? )
0

...しかし、正規表現を中間変数に割り当てる必要があります。


私の質問は:ランダムな正規表現を書く方法です。言葉bashのマッチ式で?

答え1

Bashリファレンスマニュアルで提案されているように変数に入れることをお勧めします。3.2.4.2 条件付き構成:

シェル変数に正規表現を格納することは、シェル固有の文字を引用するときに問題を回避する便利な方法であることがよくあります。場合によっては、引用符を使用せずに正規表現を文字通り指定したり、シェルの引用符の削除に注意しながら、正規表現で使用されている引用符を追跡することは困難です。シェル変数を使用してパターンを保存すると、これらの問題を軽減できます。

ただし、これをBash拡張テストに直接書き込むには、引用符を削除してスペースをエスケープする必要があります。

$ [[ ' 123 ' =~ ^\ [0-9]+\ $ ]]; echo $?
0

答え2

Bashの標準的な答えは次のとおりです。変数の使用

$ reg='^ [0-9]+ $'
$ [[ ' 123 ' =~ $reg ]]; echo $?

これは空白、バックスラッシュ、その他多くの項目と連携します。

$ reg='^ 12\3 $'
$ [[ ' 12\3 ' =~ $reg ]]; echo $?
0

次のように書きたい場合言葉あなたはプレイする必要があります(注意深い)そして引用しました。
引用する必要があります部分リテラルでなければならず、正規表現として解釈されるべき部分は引用符なしでそのままにしてください。スペースを引用する必要があります。ここではバックスラッシュが使用されます。

$ [[ ' 123 ' =~ ^\ [0-9]+\ $ ]]; echo $?
0

ここでは二重引用符を使用してください。

$ [[ ' 123 ' =~ ^" "[0-9]+" "$ ]]; echo $?

しかし、「引用符」は、バックスラッシュなどの文字のために非常に汚れている可能性があります。

$ [[ ' 12\3 ' =~ ^" "[0-9]+"\\"[0-9]+" "$ ]]; echo $?
0

より簡単で安全性:

$ reg='^ [0-9]+\\[0-9]+ $'
$ [[ ' 12\3 ' =~ $reg ]]; echo $?
0

そしていいえ、これを行うにはサブシェルは必要ありません(質問の角かっこ)。

$ reg='^ [0-9]+\\[0-9]+ $'; [[ ' 12\3 ' =~ $reg ]]; echo $?

はい、迷惑に思えるかもしれません。はい、提供されたコマンドはzshで実行されます。

$ [[ ' 123 ' =~ '^ [0-9]+ $' ]]; echo $?
0

しかし、引用は常に問題です(すべてのシェルで)。バックスラッシュはどうなりますか? :

% [[ ' 12\3 ' =~ ' 12\3 ' ]]; echo $?
zsh: failed to compile regex: Invalid back reference
1


% [[ ' 12\3 ' =~ '^ [0-9]+\\3 $' ]]; echo $?
0

ダブル!完全ではありません。言葉

関連情報