El problema
No hay una manera fácil de obtener una permutación con una expresión regular.
- Permutación: Obtener una palabra ("aabc") en otro orden, sin cambiar el número o el tipo de letras.
- Regex: expresión regular.
Para verificar:
- "Permutaciones de expresiones regulares sin repetición" La respuesta crea un código JavaScript en lugar de una expresión regular, suponiendo que esto sea más simple.
- "Cómo encontrar todas las permutaciones de una palabra dada en un texto dado" - La respuesta tampoco usa expresiones regulares.
- "Regex para que coincida con todos {1, 2, 3, 4} sin repetición" - La respuesta usa expresiones regulares, pero no es adaptable ni simple.
- Esta respuesta incluso afirma: "Una expresión regular no puede hacer lo que está pidiendo. No puede generar permutaciones a partir de una cadena" .
El tipo de solución que estoy buscando
Debe tener la forma:
- »Aabc« (o cualquier otra cosa que pueda usar entre paréntesis de apertura y cierre)
- (aabc)! (similar a (abc)? pero con otro símbolo al final)
- [aabc]! (similar a [abc] + pero con otro símbolo al final)
Ventajas de estas soluciones
Son:
- fácil
- adaptable
- reutilizable
Por qué esto debería existir
- Las expresiones regulares son una forma de describir una gramática de un lenguaje regular. Tienen todo el poder de ser cualquier tipo de lenguaje regular.
- Digamos que los lenguajes regulares son lo suficientemente potentes para las permutaciones (prueba a continuación): ¿por qué no hay una manera fácil de expresar esto?
Entonces mi pregunta es:
- (¿Por qué?) ¿Está equivocada mi prueba?
- Si es correcto: ¿por qué no hay una manera fácil de expresar permutaciones?
La prueba
- Las expresiones regulares son una forma de notar la gramática de un lenguaje regular. Pueden describir cualquier gramática de idiomas regulares.
- Otra forma de describir cualquier gramática de los idiomas regulares (que tienen un número finito de letras dentro de su alfabeto) son los autómatas no deterministas (con un número finito de estados).
Con un número finito de letras, puedo crear este autómata: (Ejemplo. Formal: ver más abajo)
Gramática que acepta permutaciones de "abbc":
(busque números en la parte superior, tal vez alguien sepa cómo hacer que esta parte se vea mejor)
s -> ah¹
s -> bh²
s -> ch³
h¹ -> bh¹¹
h¹ -> ch¹²
h² -> ah¹¹ (sin error tipográfico)
h² -> bh²²
h² -> ch²³
h³ -> ah¹²
h³ -> bh²³
h¹¹ -> bc
h¹¹ -> cb
h¹² -> bb
h²² -> ac
h²² -> ca
h²³ -> ab
h²³ -> ba
Más formal: (usando un autómata de estado finito, pero esto también podría hacerse con gramática)
- Una palabra q (con longitud finita) a la que cualquier permutación debe alcanzar un estado de aceptación.
- X es el alfabeto finito.
- El conjunto de estados S contiene cualquier orden de letras hasta la longitud de q. (Por lo tanto, el tamaño de S es finito). Más un estado de "cualquier palabra más larga".
- función de transición de estado d que toma una letra y se mueve en el estado que corresponde a la parte ahora leída de la palabra.
- F es un conjunto de estados que son permutaciones exactas de q.
Por lo tanto, es posible crear un autómata de estado finito para aceptar permutaciones de una palabra dada.
Continuando con la prueba
Así que he demostrado que los idiomas normales tienen el poder de verificar las permutaciones, ¿no?
Entonces, ¿por qué no hay un enfoque para alcanzar esto con Regexes? Es una funcionalidad útil.
^(a()|a()|b()|c()){4}\2\3\4\5$
parece funcionar (ver regex101.com/r/9URPpg/4/tests ).