考慮する:
$ 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-3]
どちらも1、2、3を意味しませんか\(1\|3\|2\)
?そうでなければなぜですか?それらの違いは何ですか?- 逆参照はなぜでのみ機能しますか
\(\)
?
答え1
パート1関連:はい、両方のパターンは1、2、または3と一致します。
最初の質問に対する部分的な回答はい2番目の質問です。楽しく。
括弧は、逆参照を有効にし、演算子の優先順位/グループ化を明確にするために使用されます。
角かっこで囲むキャラクタークラス。彼らは一致するために使用されます一つ内部の文字セットの例。
たとえば、\(hello\)
「hello」という単語を一致させて、適切な逆参照変数(など)に入れ\1
ます\2
。
一方、[hello]
単一の文字、すなわち {e,h,l,o} セットの文字が一致します。
いくつかの追加データ(単なる追加情報):
逆参照は、閉じ括弧の順序ではなく、開く括弧の順序に基づいています。ネストされた括弧の場合、これは重要です。読みやすくするために、エスケープ文字は無視されます。包含と包含が発生します(this (that) (the other))
。\1
this that the other
\2
that
\3
the other
文字クラスを計算すると、その文字クラスのより多くのインスタンスがあるかどうかが確認されます。同じ方法で一致する必要はありません。たとえば、[0-9]
単一の数字と一致し、[0-9]{5}
5つの数字と一致します。 5つだけ一致させたいなら繰り返すたとえば、77777 または 33333 と一致するが 37497 と一致しない数字は逆参照を使用します。\([0-9]\)\1{4}
答え2
()
「グループ化する」という意味と部分を設定するという意味ひも1つのプロジェクトで実行可能で、逆参照用としても活用可能です。[]
方法シンボル置く
したがって、単一の記号に括弧のみを使用すると、意味は同じです。ただし、通常、次のようなマルチシンボル文字列に使用されます。(cat|dog)