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 ).Respuestas:
Los teoremas fundamentales de la teoría del lenguaje formal son que las expresiones regulares, las gramáticas regulares, los autómatas finitos deterministas (DFA) y los autómatas finitos no deterministas (NFA) describen todos los mismos tipos de lenguajes: a saber, los lenguajes regulares. El hecho de que podamos describir estos idiomas de maneras completamente diferentes sugiere que hay algo natural e importante acerca de estos idiomas, de la misma manera que la equivalencia de las máquinas de Turing, el cálculo lambda y todo tipo de otras cosas sugiere que los lenguajes computables Son naturales e importantes. No son solo un artefacto de las decisiones aleatorias que tomó el descubridor original.
Supongamos que añadimos una nueva regla para la creación de expresiones regulares: si es una expresión regular, entonces es una expresión regular, y que coincide con todas las permutaciones de cada cadena coincidente por . Entonces, por ejemplo, . El problema es que esto rompe las equivalencias fundamentales descritas anteriormente. es el idioma de las cadenas que contienen un número igual de sy sy este no es un lenguaje normal. Compare esto con, por ejemplo, agregar un operador de negación o inversión a las expresiones regulares, lo que no cambia la clase de lenguajes que se aceptan.R π(R) R L(π(abc))={abc,acb,bac,bca,cab,cba} L(π((ab)∗))) a b
Entonces, para responder la pregunta del título, las expresiones regulares no pueden hacer permutaciones y no agregamos esa capacidad porque las expresiones regulares no coincidirían con los lenguajes regulares. Dicho esto, es posible que las "expresiones regulares con permutaciones" también sean una clase interesante de lenguajes con muchas caracterizaciones diferentes.
fuente
!
operador en la práctica, y supongo que pocas personas lo tienen, ya que es fácil de implementar y no implementan expresiones regulares extendidas. Lo he visto lo apoya.Su "prueba" solo miró permutaciones de palabras individuales, que son idiomas finitos.
Cada idioma finito es regular (por ejemplo, simplemente enumerando todos los miembros con un
|
intermedio), pero hay infinitos idiomas regulares (y esos son generalmente los más interesantes).Tan pronto como obtenga una expresión regular (o gramática / autómata) que acepte un lenguaje infinito (es decir, una expresión con el
*
operador o un autómata con un bucle), su construcción ya no funcionará (obtendrá una gramática / autómata infinito) )La respuesta de David Richerby proporcionó un ejemplo de un lenguaje regular cuyo lenguaje de permutación ya no es regular; todos estos ejemplos son idiomas infinitos.
fuente
Sea un alfabeto de tamaño . Una expresión regular que describe todas las permutaciones de debe tener un tamaño exponencial. Esto se desprende del Teorema 9 en Límites inferiores para las gramáticas libres de contexto , que proporciona un límite inferior exponencial en el modelo mucho más fuerte de las gramáticas libres de contexto (una expresión regular de tamaño se puede convertir en una gramática libre de contexto de tamaño ).Σ n Σ m O(m)
Entonces, en cierto sentido, no hay una forma sucinta de especificar todas las permutaciones de una palabra.
Aquí hay una prueba simple para un límite inferior en el tamaño de una expresión regular para el lenguaje de todas las permutaciones de un alfabeto de tamaño . Dado que una expresión regular de tamaño se puede convertir en un NFA con estados , es suficiente dar un límite inferior en los NFA.Ω~(2n) Σ n m O(m)
fuente
¿Por qué no hay forma de escribir "permutación de" en expresiones regulares?
Una permutación de un lenguaje regular e infinito (cantidad infinita de palabras) no es necesariamente regular. Por lo tanto, no se puede escribir como expresión regular.
Prueba
Piensa en el lenguaje
(ab)*
. (Ejemplo inspirado en David Richerby .) Una de sus permutaciones esa*b*
. Este no es un lenguaje normal. qedfuente