Saltar al contenido

¿Cómo convierto cualquier expresión regular en un complemento de sí mismo sin una edición manual compleja?

Esta pregunta se puede tratar de diversas maneras, pero nosotros te enseñamos la solución más completa para nosotros.

En primer lugar, creo que te refieres al complemento de una expresión regular, no es inversa. La inversa de una expresión regular no tiene mucho sentido; pero si se ve como una función, supongo que podría decir que la inversa del matcher es el generador que genera todas las cadenas coincidentes, o algo así. Por otro lado, el complemento de un idioma son todas esas cadenas no en el idioma original.

Entonces, hay dos puntos de vista a considerar aquí:

Fundamentalmente

El complemento de un idioma regular es regular. Eso significa que es posible generar un DFA de aceptación para el complemento (y hacerlo es muy simple, en realidad: simplemente cambie el conjunto de estados de no aceptación por el conjunto de estados de aceptación). Cualquier DFA de este tipo se puede expresar como una expresión regular, por lo que, en principio, puede hacer una expresión regular de este tipo.

Consulte el artículo de wikipedia sobre idiomas regulares como punto de partida.

Prácticamente

La sintaxis típica de expresiones regulares compatible con Perl que se usa en la mayoría de los lenguajes modernos hoy en día no tiene un operador de complementación. Para completo regex, puede obtener algo similar utilizando el operador de búsqueda anticipada negativa: (?!X) coincidirá con un string precisamente cuando X no. Sin embargo, este es un reemplazo deficiente para el operador de complemento, ya que no podrá usarlo como parte de una expresión regular más grande de la manera habitual; esta expresión regular no “consume” la entrada, lo que significa que se comporta de manera diferente en conjunto con otros operadores.

Por ejemplo, si hace coincidir cadenas numéricas como [0-9]*, para que coincida con todo string usted antepondría ^ y anexar $, pero para usar esta técnica para encontrar el complemento, necesitaría escribir ^(?!^[0-9]*$).*$ – y la concatenación habitual de una expresión regular negada es, por lo que puedo decir, que se puede deshacer.

Irónicamente, la encarnación práctica de las expresiones regulares es teóricamente más potente debido a las referencias inversas, pero prácticamente menos flexible ya que el lenguaje no puede expresar con facilidad las operaciones de complemento e intersección.

Simplemente ejecute la expresión regular e invierta lógicamente la salida. Así que cambia:

if(/foo/)

a:

if(!/foo/)

Las clases de caracteres se pueden invertir con un quilate inicial:

[A-Z] -> [^A-Z]

Muchos de los caracteres especiales también tienen inversas, si escribe en mayúscula el especificador.

s whitespace
S non-whitespace
w word character
W non-word-character
d digit
D non-digit

Varias variaciones a considerar:

Coincidir con un string que consta de un determinado conjunto de caracteres: ^[a-z]*$

Coincidir con un string que consiste en todo menos un cierto conjunto de caracteres: ^[^a-z]*$

Tenga en cuenta que hay algunos atajos:

  • w: cualquier carácter alfanumérico (incluido _),
  • W: cualquier carácter no alfanumérico;
  • s: cualquier carácter de espacio en blanco,
  • S: cualquier carácter que no sea un espacio en blanco,
  • d: cualquier dígito,
  • D: cualquier que no sea un dígito.

Esto puede complicarse bastante, por ejemplo si quieres …

  • solo no letras: [d_W], o
  • solo cartas: [^d_W] (es decir, “no es un dígito, no un _y no un carácter no alfanumérico)

Coincidir con un string que contiene una subcadena: ^.*substring.*$

Coincidir con un string ese no contener una subcadena: ^(?:(?!substring).)*$

Tenga en cuenta cómo tenemos que comprobar cada posición en el string para la “no presencia” de la subcadena. También puede sustituir cualquier expresión regular por substring para hacer coincidir cadenas que contienen o no contienen una determinada sub-expresión regular.


Coincidir con cualquier cosa: .* (si también desea hacer coincidir nuevas líneas, deberá configurar la opción correspondiente de su lenguaje de programación, por ejemplo re.DOTALL en Python)

Haga coincidir cualquier cosa si no sabe cómo configurar esa opción: [sS]*

Nunca coincidir con cualquier cosa (por la razón que sea):

  • $^ (es decir, coincidir con el final de la string antes del inicio de la string),
  • bB (coincidir con una posición donde hay al mismo tiempo un límite de palabras y no un límite de palabras) o
  • (?!) (coincidir con una posición en la que es imposible igualar el vacío string).

Nos puedes defender nuestra función añadiendo un comentario y dejando una valoración te lo agradecemos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags :

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *