グループ
()
グループ
|
OR
\番号
後方参照
(?:)
キャプチャしないグループ
()
グループ
echo 'りんごパイ りんごジュース' | \
egrep --only-matching 'りんご(ジュース)?'
りんご
りんごジュース
echo 'りんご
りんごジュース' | egrep '(りんご)$'
りんご
|
OR
echo 'みかんジュース' | \
egrep --only-matching '(りんご|みかん|いちご)ジュース'
みかんジュース
\番号
後方参照 (Backreferences)
- グループ
()
で、まず1回目のマッチ
- その後ろで、同じものにマッチ
例: (.+)語を話す\1人
- 「A語を話すA人」や「B語を話すB人」にマッチ
- 「X語を話すY人」にはマッチしない
「後方」のここでの意味
番号の使い方
- 括弧の登場順に、
\1
から開始
- 入れ子グループ: 外側括弧が先
(日本(人|語))
=> \1
は「日本人」「日本語」、\2
は「人」「語」を指す
グループが入れ子でないとき
echo "日本語を話す日本人
日本語を話す宇宙人
宇宙語を話す宇宙人" | egrep '(.+)語を話す\1人'
日本語を話す日本人
宇宙語を話す宇宙人
入れ子のグループ
echo "たけやぶやけた
たけやぶもえた" | egrep '((.)(.)(.))ぶ\4\3\2'
たけやぶやけた
(?:)
キャプチャしないグループ (Non-capturing group)
- 後方参照しないグループで使う
grep --perl-regexp
のみ
echo "たけやぶやけた
たけやぶもえた" | \
grep --perl-regexp '(?:(.)(.)(.))ぶ\3\2\1'
# 外側の()がキャプチャしないグループ
たけやぶやけた
egrep
ではマッチせずエラーにもならない
sed
ではエラー
echo 'ぎょぎょ' | sed -r --quiet '/(?:ぎょ)+/ p'
sed: -e expression #1, char 14: 無効な前方正規表現です