基本正規表現の[]と\(\)の違い

基本正規表現の[]と\(\)の違い

考慮する:

$ echo '<H1>heading</H1>' | grep '<H\(1\|3\|2\)>.*</H\1>'
$ <H1>heading</H1>

そして

$ echo '<H1>heading</H3>' | grep '<H[1-3]>.*</H\1>'
$ grep: Invalid back reference

最初のコマンドは正しく機能します。

  1. [1-3]どちらも1、2、3を意味しませんか \(1\|3\|2\)?そうでなければなぜですか?それらの違いは何ですか?
  2. 逆参照はなぜでのみ機能しますか\(\)

ベストアンサー1

パート1関連:はい、両方のパターンは1、2、または3と一致します。

最初の質問に対する部分的な回答はい2番目の質問です。楽しく。

括弧は、逆参照を有効にし、演算子の優先順位/グループ化を明確にするために使用されます。

角かっこで囲むキャラクタークラス。彼らは一致するために使用されます一つ内部の文字セットの例。

たとえば、\(hello\)「hello」という単語を一致させて、適切な逆参照変数(など)に入れ\1ます\2

一方、[hello]単一の文字、すなわち {e,h,l,o} ​​セットの文字が一致します。

いくつかの追加データ(単なる追加情報):

逆参照は、閉じ括弧の順序ではなく、開く括弧の順序に基づいています。ネストされた括弧の場合、これは重要です。読みやすくするために、エスケープ文字は無視されます。包含と包含が発生します(this (that) (the other))\1this that the other\2that\3the other

文字クラスを計算すると、その文字クラスのより多くのインスタンスがあるかどうかが確認されます。同じ方法で一致する必要はありません。たとえば、[0-9]単一の数字と一致し、[0-9]{5}5つの数字と一致します。 5つだけ一致させたいなら繰り返すたとえば、77777 または 33333 と一致するが 37497 と一致しない数字は逆参照を使用します。\([0-9]\)\1{4}

おすすめ記事