solo regulares regular probar negacion letras expresiones expresion excluir espacios espacio ejemplos concatenar cadena blanco alfanumerico regex emacs elisp regex-negation regex-group

regex - regulares - negacion expresion regular



¿Cómo escribo una expresión regular que excluye en lugar de coincidencias, por ejemplo, no(esta | cadena)? (6)

¡Es difícil creer que la respuesta aceptada (de Gumbo) fue realmente aceptada! A menos que haya sido aceptado porque indicó que no puede hacer lo que quiere. A menos que tenga una función que genere tales expresiones regulares (como muestra Gumbo), componerlas sería un verdadero dolor.

¿Cuál es el caso de uso real? ¿Qué estás tratando de hacer realmente?

Como indicó Tomalak, (a) esto no es lo que hacen las expresiones regulares; (b) vea la otra publicación a la que se vinculó, para obtener una buena explicación, incluyendo qué hacer con su problema.

La respuesta es usar una expresión regular para coincidir con lo que no desea, y luego restarlo del dominio inicial. IOW, no intente hacer que la expresión regular haga la exclusión (no puede); haga la exclusión después de usar una expresión regular para que coincida con lo que desea excluir.

Así es como funcionan todas las herramientas que usan expresiones regulares (p. Ej., grep ): ofrecen una opción separada (p. Ej. A través de la sintaxis) que realiza la resta, después de hacer coincidir lo que se debe restar.

Estoy perplejo tratando de crear una expresión regular de Emacs que excluya grupos. [^] excluye caracteres individuales en un conjunto, pero quiero excluir secuencias específicas de caracteres: algo como [^(not|this)] , para que las cadenas que contienen "no" o "esto" no coincidan.

En principio, podría escribir ([^n][^o][^t]|[^...]) , pero ¿hay alguna otra forma más limpia?


En primer lugar: [^n][^o][^t] no es una solución. Esto también excluiría palabras como nil ( [^n] no coincide), bob ( [^o] no coincide) o cat ( [^t] no coincide).

Pero es posible construir una expresión regular con una sintaxis básica que coincida con cadenas que ni contienen ni this :

^([^nt]|n($|[^o]|o($|[^t]))|t($|[^h]|h($|[^i]|i($|[^s]))))*$

El patrón de esta expresión regular es permitir cualquier carácter que no sea el primer carácter de las palabras o solo los prefijos de las palabras pero no las palabras completas.


Esto no es fácilmente posible. Las expresiones regulares están diseñadas para hacer coincidir cosas, y esto es todo lo que pueden hacer.

En primer lugar: [^] no designa un "grupo excluye", designa una clase de caracteres negada. Las clases de personajes no admiten la agrupación en ninguna forma o forma. Son compatibles con caracteres individuales (y, por conveniencia, rangos de caracteres). Su intento [^(not|this)] es 100% equivalente a [^)(|hinots] , en lo que respecta al motor de [^)(|hinots] regulares.

Tres formas pueden salir de esta situación:

  1. coincida (not|this) y excluya cualquier coincidencia con la ayuda del entorno en el que se encuentra (negar resultados de coincidencia)
  2. use la anticipación negativa, si es compatible con su motor de expresiones regulares y es factible en la situación
  3. reescriba la expresión para que pueda coincidir : vea una pregunta similar que hice antes

Para el caso de uso de hacer coincidir una cadena para una prueba lógica, hago esto:

;; Code to match string ends with ''-region'' but excludes those that has ''mouse''. M-x ielm RET *** Welcome to IELM *** Type (describe-mode) for help. ELISP> (setq str1 "mouse-drag-region" str2 "mou-drag-region" str3 "mou-region-drag") "mou-region-drag" ELISP> (and (string-match-p "-region$" str1) (not (string-match-p "mouse" str1))) nil ELISP> (and (string-match-p "-region$" str2) (not (string-match-p "mouse" str2))) t ELISP> (and (string-match-p "-region$" str3) (not (string-match-p "mouse" str3))) nil

Utilizo este enfoque para evitar el error de la función que discutí aquí :


Pruebe Mx líneas de color.


Suena como si estuvieras tratando de hacer un lookahead negativo. es decir, está intentando dejar de hacer coincidir una vez que alcanza un delimitador.

Emacs no admite directamente Lookahead, pero sí es compatible con la versión no codiciosa de *, + y? Operadores (* ?, + ?, ??), que pueden usarse para el mismo propósito en la mayoría de los casos.

Así, por ejemplo, para que coincida con el cuerpo de esta función javascript:

bar = function (args) { if (blah) { foo(); } };

Puedes usar este regex de emacs:

function ([^)]+) {[[:ascii:]]+?};

Aquí nos detenemos una vez que encontramos la secuencia de dos elementos "};". [[: ascii:]] se usa en lugar de "." Operador porque funciona sobre múltiples líneas.

Esto es un poco diferente al lookahead negativo porque el}; Sin embargo, si su objetivo es extraer todo hasta ese punto, simplemente use un grupo de captura / (y /).

Consulte el manual de expresiones regulares de emacs: http://www.gnu.org/software/emacs/manual/html_node/emacs/Regexps.html

Como nota al margen, si escribe cualquier tipo de expresión regular de emacs, asegúrese de invocar Mx re-builder, que mostrará un poco de IDE para escribir su expresión regular contra el búfer actual.