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.
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 letrae
en la palabraThere
.There ^
Sin embargo, si no desea la
e
seguida inmediatamente porr
, puede usar RegExe(?!r)
. Ahora el resultado sería:There ^
- Considera una palabra
Lookahead positivo
Lookahead positivo funciona igual.
q(?=u)
coincide con unaq
que es seguida inmediatamente por unau
, sin formar lau
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 letrat
en word.getting ^
Sin embargo, si desea la
t
que es seguida inmediatamente pori
, entonces puede usar RegExt(?=i)
. Ahora el resultado sería:getting ^
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)
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."