Ответ ( сложный пример с использованием групп захвата и счетчиков повторов ):
egrep '([a-z]{3})(-\1){2}'
Соответствует следующему шаблону с дефисом в качестве только допустимого разделителя.
abc-abc-abc
ssd-ssd-ssd
zab-zab-zab
.
.
.
В приведенном выше примере есть два набора паренов (групп захвата);каждый захватывает свой совпадающий текст в свой буфер, соответствующий группе захвата.Нам нужно только заключить в скобки второе выражение соответствия, чтобы мы могли дать ему счетчик повторений и заинтересовать захваченный текст 2-й группы.
Более простой пример
Thisэто похожий случай, но легче понять.Он соответствует 3 одинаковым строчным буквам в строке:
egrep '([a-z])\1\1'
([a-z])
- это группа захвата, которая соответствует одной строчной букве и сохраняет соответствующий символ в буфере группы захвата.Примечание. Каждый \1
соответствует вновь захваченному тексту (в данном случае 1 соответствующий символ).
<strong>NOTE</strong>
: Группа захвата соответствует символу первый последовательность, поэтому необходимы два дополнительных сопоставления с сохраненным текстом из первого совпадения, чтобы сопоставить три одинаковых символа в строке.Следующий пример идентичен приведенному выше, за исключением того, что он использует счетчик повторений (2)
для повторения второго слагаемого два раза.
egrep '([a-z])\1{2}'
Я проверял это следующим образом:
$ echo "aaa" | egrep '([a-z])\1{2}'
aaa
$ echo "zzz" | egrep '([a-z])\1{2}'
zzz
$ echo "zaz" | egrep '([a-z])\1{2}'
примечание: нет выхода для третьей линии эха
Как работают группы захвата
НеэкранированныеКруглые скобки - это использование элементов выражения группы вместе для повторения в качестве группы или для выполнения над ними операции, но также приводит к тому, что сопоставленный текст захватывается во внутренний буфер.
Первая группа захвата,слева направо в регулярном выражении - \1
, второе - \2
, третье \3
...
Везде, где вы хотите заменить захваченный текст совпадения в регулярное выражение, используйте обратную косую чертуномер, соответствующий интересующей группе захвата.