regulares regular probar expressions expresiones espacio ejemplos caracteres cadena regex regex-greedy

regex - probar - Signos de interrogación en expresiones regulares



probar expresiones regulares (4)

Algunos otros usos de los signos de interrogación en expresiones regulares

Aparte de lo que se explica en otras respuestas, todavía hay 3 usos más de los signos de interrogación en expresiones regulares.

  1. Lookahead negativo

    Los lookaheads negativos se utilizan si desea hacer coincidir algo que no es seguido por algo más. El constructo de lookahead negativo es el par de paréntesis, con el paréntesis de apertura seguido por un signo de interrogación y un signo de exclamación. x(?!x2)

    ejemplo

    • Considera una palabra There
    • Ahora, de forma predeterminada, RegEx e encontrará la tercera letra e en la palabra There .

      There ^

    • Sin embargo, si no desea la e seguida inmediatamente por r , puede usar RegEx e(?!r) . Ahora el resultado sería:

      There ^

  2. Lookahead positivo

    Lookahead positivo funciona igual. q(?=u) coincide con una q que es seguida inmediatamente por una u , sin formar la u de la coincidencia. El constructo de lookahead positivo es un par de paréntesis, con el paréntesis de apertura seguido por un signo de interrogación y un signo igual.

    ejemplo

    • Considere la posibilidad de obtener una palabra
    • Ahora, de forma predeterminada, RegEx t buscará la tercera letra t en word.

      getting ^

    • Sin embargo, si desea la t que es seguida inmediatamente por i , entonces puede usar RegEx t(?=i) . Ahora el resultado sería:

      getting ^

  3. Grupos no capturadores

    Cada vez que coloca una expresión regular entre paréntesis () , crean un grupo de captura numerado. Almacena la parte de la cadena que coincide con la parte de la expresión regular dentro de los paréntesis.

    Si no necesita que el grupo capture su coincidencia, puede optimizar esta expresión regular en

    (?:Value)

Vea también this y this .

Estoy leyendo la referencia de expresiones regulares y estoy pensando en? y ?? caracteres. ¿Podrías explicarme con algunos ejemplos su utilidad? No los entiendo lo suficiente.

gracias


Esta es una excelente pregunta, y me tomó un tiempo para ver el punto de la pereza ?? cuantificador a mí mismo.

? - Cuantificador opcional (codicioso)

La utilidad de ? Es bastante fácil de entender. Si quisiera encontrar http y https , podría usar un patrón como este:

https?

Este patrón coincidirá con ambas entradas, porque hace que la s opcional.

?? - Cuantificador opcional (perezoso)

?? es mas sutil Por lo general, hace lo mismo ? hace. No cambia el resultado verdadero / falso cuando se pregunta: "¿Satisface esta entrada esta expresión regular?" En cambio, es relevante para la pregunta: "¿Qué parte de esta entrada coincide con esta expresión regular y qué partes pertenecen a qué grupos?" Si una entrada podría satisfacer el patrón de más de una manera, el motor decidirá cómo agruparlo en función de ? vs. (o * contra *? o + contra +? ).

Digamos que tiene un conjunto de entradas que desea validar y analizar. Aquí hay un ejemplo (ciertamente tonto):

Input: http123 https456 httpsomething Expected result: Pass/Fail Group 1 Group 2 Pass http 123 Pass https 456 Pass http something

Intenta lo primero que viene a la mente, que es this :

^(http)([a-z/d]+)$

Pass/Fail Group 1 Group 2 Grouped correctly? Pass http 123 Yes Pass http s456 No Pass http something Yes

Todos pasan, pero no puedes usar el segundo conjunto de resultados porque solo querías 456 en el Grupo 2.

Bien, vamos a intentarlo de nuevo . Digamos que el Grupo 2 puede ser letras o números, pero no ambos:

(https?)([a-z]+|/d+)

Pass/Fail Group 1 Group 2 Grouped correctly? Pass http 123 Yes Pass https 456 Yes Pass https omething No

Ahora la segunda entrada está bien, pero la tercera está mal agrupada porque ? es codicioso por defecto (el + es también, pero el ? vino primero). ¿Al decidir si la s es parte de https? o [az]+|/d+ , si el resultado es un pase de cualquier manera, el motor de expresiones regulares siempre elegirá el de la izquierda. Así que el Grupo 2 pierde s porque el Grupo 1 lo absorbió.

Para arreglar esto, haces un pequeño cambio :

(https??)([a-z]+|/d+)$

Pass/Fail Group 1 Group 2 Grouped correctly? Pass http 123 Yes Pass https 456 Yes Pass http something Yes

Esencialmente, esto significa: " https coincidir https si es necesario, pero vea si esto todavía pasa cuando el Grupo 1 es solo http ". El motor se da cuenta de que la s podría funcionar como parte de [az]+|/d+ , por lo que prefiere colocarlo en el Grupo 2.


? simplemente hace que el elemento anterior (carácter, clase de caracteres, grupo) sea opcional:

colou?r

combina "color" y "color"

(swimming )?pool

coincide con "una piscina" y "la piscina"

?? es el mismo, pero también es perezoso, por lo que el artículo se excluirá si es posible. Como esos documentos notan, ?? Es raro en la práctica. Nunca lo he usado.


La diferencia clave entre ? y ?? se refiere a su pereza . ?? es perezoso ? no es.

Digamos que desea buscar la palabra "auto" en un cuerpo de texto, pero no quiere estar restringido solo al singular "auto"; Usted también quiere hacer coincidir contra el plural "coches".

Aquí hay una oración de ejemplo:

I own three cars.

Ahora, si quisiera unir la palabra "auto" y solo quisiera obtener la cadena "auto" a cambio , ¿usaría el vago ?? al igual que:

cars??

Esto dice, "busque la palabra automóvil o automóviles; si encuentra alguna, devuelva el car y nada más".

Ahora, si quisiera hacer coincidir contra las mismas palabras ("coche" o "autos") y quisiera obtener todo el partido a cambio , ¿usaría el no perezoso ? al igual que:

cars?

Esto dice, "busque la palabra automóvil o automóviles, y devuelva el automóvil o los automóviles, lo que encuentre".

En el mundo de la programación de computadoras, perezoso generalmente significa "evaluar solo lo que se necesita". Así que el perezoso ?? solo devuelve todo lo que se necesita para hacer una coincidencia; ya que la "s" en "autos" es opcional, no la devuelva. Por otro lado, las operaciones no perezosas (a veces llamadas codiciosas ) evalúan todo lo posible, de ahí que ? devuelve todo el partido, incluida la "s" opcional.

Personalmente, me encuentro usando ? como una forma de hacer que otros operadores de expresiones regulares sean perezosos (como los operadores * y + ) con más frecuencia de la que lo uso para la opcionalidad de caracteres simples, pero YMMV.

Véalo en el código

Aquí está lo anterior implementado en Clojure como ejemplo:

(re-find #"cars??" "I own three cars.") ;=> "car" (re-find #"cars?" "I own three cars.") ;=> "cars"

El elemento re-find es una función que toma su primer argumento como una expresión regular #"cars??" y devuelve la primera coincidencia que encuentra en el segundo argumento "I own three cars."