(a\b) \1
以下では、正規表現を標準入力としてエクスポートし、いくつかのgrep
テスト文字列を挿入します。
$ grep -E '(a\b) \1' ああ ああ ab ああ第二
太字のテキストは一致を示します。 2番目はa ab
私をパニックにさせました。キャプチャリンググループは、文字通り「a
文字の後に単語の境界が続く」と説明できます。
文字列を処理すると、a ab
正規表現エンジンは文字を一致させ、a
その後に「単語文字」がないことを確認して一致します\b
。その後、スペースと一致します。今まではそんなに良くなった。
\1
しかし、一致することを確認する必要がありますが、ab
私が知っている限り、次には単語文字があるので一致しないでください。何が起こったのか理解できません!a
ab
答えを受け入れた後でも、私はまだ何が起こっているのか実際に理解していないことに気づきました。上記の例から始めると、次のようになります。
$ cat tests
a bab
a ba
a ab
$ grep -E '(\ba\b) \1' tests
a ab
これは、キャプチャグループに文字列の右端にある単語の境界を除くすべてが含まれていることを意味しますが、これはまだ理解されていません。
答え1
質問は\1
一致するテキストを参照し、いいえ正規表現。私たちの場合、一致するテキストは文字ですa
。正規表現ではなくテキストなので\1
気にしませんa
。
$ cat file
a a
a ab
$ grep -E '(a\b) \1' file
a a
a ab
\1
単語にしたい場合は、単語の境界を追加してください。
$ grep -E '(a\b) \1\b' file
a a
\1\b
最後に単語の境界が必要なので、\1
2行目はもはや一致しません。
\1
これが正規表現ではないことを証明するには、次のことを試してください。
$ echo '.a' | grep -E '(.)\1'
$
しかし:
$ echo '..' | grep -E '(.)\1'
..
$
したがって、\1
match .
. は.
通常、正規表現がアクティブになり、すべての文字と一致しますが、\1
ピリオドのみが一致します。
文書
~からGNU grep マニュアル:
逆参照 '\n'、ここで n は単一の数値です。以前に一致した部分文字列と一致正規表現の括弧で囲まれたn番目のサブ式です。たとえば、「(a)\ 1」は「aa」と一致します。代替と組み合わせて使用する場合、逆参照は、グループが一致に参加しない場合、一致全体が失敗するようにします。たとえば、 "a(.)|b\1" は "ba" と一致しません。 -e または file('-f file') とともに複数の正規表現が提供される場合、逆参照は各式に対してローカルです。 [強調する。 ]