Me pidieron que encontrara el conjunto de palabras que comienzan con una subcadena de longitud 3 que contiene los caracteres a, byc y que además contiene otra subcadena separada que contiene los mismos 3 caracteres.
ex. abcacb acbbac
ayúdame a encontrar una expresión regular para esto. Gracias
editar: abcbac - a,b,c deberían estar allí como las primeras 3 letras, luego a,b,c deberían cambiar su orden con respecto a las 3 letras anteriores. sólo 6 cadenas de caracteres.
acbbca abccba bacbca etc....
Respuesta1
(Las soluciones aquí suponen que GNU grep
cuando se construye con soporte PCRE (como suele ser el caso en cygwin)).
La primera mitad de sus requisitos significaría.
grep -Pwo '(abc|acb|bac|bca|cab|cba)\w*(?1)\w*'
O posiblemente:
grep -Pwo '(abc|acb|bac|bca|cab|cba)\w*\1\w*'
Para la segunda mitad eso parece contradecir la primera mitad:
grep -Pwo '(abc|acb|bac|bca|cab|cba)(?!\1)(?1)'
encontraría elpalabras(palabradefinido como una secuencia de [a-zA-Z0-9_]
caracteres en este caso) que comienzan con una secuencia de 3 caracteres compuesta por a
, b
y c
(uno de cada) seguido de otra de dichas secuencias ( (?1)
refiriéndose a la misma expresión regular que en el primer (...)
grupo) siempre que sea no es lo mismo que el primero ( \1
se refiere a la cadena que coincidió con el primer (...)
grupo de captura y (?!...)
es unmirada negativa hacia adelanteoperador).
$ echo abcbca abcbcax abcabc aaabbb xcabacb abcacb-blah |
grep -Pwo '(abc|acb|bac|bca|cab|cba)(?!\1)(?1)'
abcbca
abcacb
Respuesta2
Esto debería hacerlo:
grep -Ew '[a-c]{3}.*[a-c]{3}'
-E
para que coincida con expresiones regulares-w
para unir solo palabras[a-c]{3}
coincidirá exactamente con 3 caracteres dela-c
conjunto.*
coincidirá con cualquier cosa entre