Pediram-me para encontrar o conjunto de palavras que começam com uma substring de comprimento 3 contendo os caracteres a, b e c e que contém adicionalmente outra substring disjunta contendo os mesmos 3 caracteres
ex. abcacb acbbac
me ajude a encontrar um regex para isso. Obrigado
editar: abcbac - a,b,c deve estar lá como as 3 primeiras letras, então a,b,c deve mudar sua ordem das 3 letras anteriores. apenas 6 sequências de caracteres.
acbbca abcba bacbca etc....
Responder1
(As soluções aqui assumem GNU grep
quando construídas com suporte PCRE (como normalmente é o caso no cygwin)).
A primeira metade de seus requisitos significaria.
grep -Pwo '(abc|acb|bac|bca|cab|cba)\w*(?1)\w*'
Ou possivelmente:
grep -Pwo '(abc|acb|bac|bca|cab|cba)\w*\1\w*'
Para o segundo tempo isso parece contradizer o primeiro tempo:
grep -Pwo '(abc|acb|bac|bca|cab|cba)(?!\1)(?1)'
Encontraria opalavras(palavrasendo definido como uma sequência de [a-zA-Z0-9_]
caracteres neste caso) que começam com uma sequência de 3 caracteres composta por a
, b
e c
(um de cada) seguido por outra dessas sequências ( (?1)
referindo-se ao mesmo regexp do primeiro (...)
grupo) desde que seja não é o mesmo que o primeiro ( \1
refere-se à string que foi correspondida pelo primeiro (...)
grupo de captura e (?!...)
é umolhar negativo para frenteoperador).
$ echo abcbca abcbcax abcabc aaabbb xcabacb abcacb-blah |
grep -Pwo '(abc|acb|bac|bca|cab|cba)(?!\1)(?1)'
abcbca
abcacb
Responder2
Isso deve servir :
grep -Ew '[a-c]{3}.*[a-c]{3}'
-E
para corresponder às expressões regulares-w
para combinar apenas palavras[a-c]{3}
corresponderá exatamente a 3 caracteres doa-c
conjunto.*
corresponderá a qualquer coisa entre