私はERE(拡張正規表現)しか使用できないので、この質問はあまり意味がないことを知っています。しかし、当分の間は、交換を実装することが唯一の選択肢です。 BREのみを使用してどのように実装できますか?それとも回避策を見つける必要がありますか?
次の文字列があるとしましょう。
AAAAAA======-----======AAAAAAAAA
私の目標は、基本正規表現のみを使用して、AAAAA、======、-----、======、およびAAAAAAAAAをそれぞれ一致させることです。これはEREを使用してすばやく実行できますが、BREでのみこれを行う方法を知りたいです。これまで、一致するいくつかの文字列が互いに重なり合わず(たとえば、「AAAAA ==」と一致する正規表現は発生しないでください)、これを実行する適切な方法が見つかりません。
答え1
簡単です:それはすべてです。いいえBREは交互に
POSIX BREは他の機能をサポートしていません。代替もサポートされていません。
あなたの基本的な目標:
今私の目標は...それぞれ...基本正規表現と一致させることです。
BREが利用可能です:
$ str='AAAAAA======-----======AAAAAAAAA'
$ echo "$str" | grep -Eo '(.)\1*'
AAAAAA
======
-----
======
AAAAAAAAA
あるいは、BRE grep で複数のパターンを使用することもできます。
$ echo "$str" | grep -o -e 'AA*' -e '--*' -e '==*'
AAAAAA
======
-----
======
AAAAAAAAA
または、ソリューションをGNU grepに制限します(\|
BRE構文でもシフトが許可されていますが、これは有効なPOSIX機能ではありません)。
$ echo "$str" | grep -o '\(AA*\)\|\(==*\)\|\(--*\)'
しかし、2番目の目標は次のとおりです。
別のキャプチャグループに追加できますか?
ただ聞いてください一つ正規表現であり、BREでは置換が不可能であるため不可能です。
答え2
繰り返される文字を含む文字列と一致します。基本正規表現:
$ echo 'AAAAAA======-----======AAAAAAAAA' | grep -o '\(.\)\1*'
AAAAAA
======
-----
======
AAAAAAAAA
.
すべての文字と一致します。 \(.\)
任意の文字と一致し、その文字をキャプチャグループ1に保存します。 \1*
同じ文字が異なる場合と一致します。
\1
BREは、次の逆参照の使用をサポートしています。POSIX。