Regex para Javascript

Estoy tratando de aprender algunas expresiones regulares básicas de Javascript. Para empezar, leí la documentación y esta SO pregunta: ¿Cómo se accede a los grupos coincidentes en una expresión regular de JavaScript?

Creo que he descifrado la mayor parte de la expresión:

/(?:^|\s)format_(.*?)(?:\s|$)/g

Excepto esta parte:

(.*?)

Yo sé eso

.*

es hacer coincidir 0 o más ocurrencias de cualquier carácter (excepto nueva línea o terminador de línea).

Pero no puedo entender por qué el

?

se necesita.

Estaba jugando con algo similar:

/(?:^|\s)ab(.*?)ab(?:\s|$)/
' ab4545ab '

Y las cosas se han estado comportando igual con o sin el

?

in

(.*?)

¿Alguna idea?

¡Gracias!

preguntado el 12 de junio de 12 a las 20:06

El signo de interrogación en ese contexto significa hacer una lazy partido. -

lea esto: excelente tutorial, ejemplos útiles y todo al grano: expresiones-regulares.info/tutorial.html, y esto en particular expresiones-regulares.info/repeat.html#lazy -

@Joanna: Gracias por esos enlaces. Ayudaron mucho. Todavía estaba confundido después de leer las respuestas (pero, por supuesto, todas me habrían apuntado en la dirección correcta), pero después de leer su enlace, todas tenían sentido. Ojalá hubieras publicado esto como respuesta. -

3 Respuestas

Hace que el .* no codicioso Esto significa que la primera aparición de la siguiente secuencia de caracteres válida en la expresión regular detendrá la .*.

Sin el ?, la .* consumirá hasta la última aparición de la siguiente secuencia de caracteres válida en la expresión regular.

var s = "foo bar boo bar foo";

var greedy = /.*bar/;
var no_greed = /.*?bar/;

greedy.exec(s); // foo bar boo bar

no_greed.exec(s); // foo bar

Entonces, el codicioso consume más allá de la primera "barra" hasta la última "barra".

El no codicioso solo va al primer "bar".

Respondido el 12 de junio de 12 a las 20:06

La ? después de .+ or .* el partido hará el partido perezoso en lugar del predeterminado codicioso. Es decir, coincidirá con la menor cantidad de caracteres posible, en contraste con tantos.

Ejemplo:

"hello".match(/.+/)    //Returns ["hello"]
"hello".match(/.+?/)   //Returns ["h"]

Respondido el 12 de junio de 12 a las 20:06

La ? hace que el cuantificador no sea codicioso. Sin eso, el * comerá tantos personajes como sea posible, lo cual es particularmente poderoso con .. Sin embargo, con el ? allí, comerá tan pocos como sea necesario.

Tome esta cadena, por ejemplo: "abcccbacba", y compararlo con /abc(.*)ba/. Dará como resultado la captura ccbac. Por otra parte, /abc(.*?)ba/ capturará cc.

Respondido el 12 de junio de 12 a las 20:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.