Si ejecuto esto:
/([^\/]+)+/g.exec('/a/b/c/d');
Entiendo esto:
["a", "a"]
Pero si ejecuto esto:
'/a/b/c/d'.match(/([^\/]+)+/g);
Entonces obtengo el resultado esperado de esto:
["a", "b", "c", "d"]
¿Cual es la diferencia?
javascript
regex
Justin Warkentin
fuente
fuente
exec
para obtener todas las sub-selecciones.+
no es necesario yamatch
que devolverá todas las sub-expresiones..exec
solo devuelve uno cada vez, por lo que tampoco lo necesita+
.Respuestas:
exec
con una expresión regular global está destinado a ser utilizado en un bucle, ya que aún recuperará todas las subexpresiones coincidentes. Entonces:String.match
hace esto por usted y descarta los grupos capturados.fuente
while(match = /[^\/]+/g.exec('/a/b/c/d')
o creará un bucle infinito! Como se indica claramente en MDN developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…new RegExp("pattern")
y/pattern/
significaba cosas diferentes.Una imagen es mejor, ya sabes ...
¿Ver la diferencia?
fuente
/regex/.exec()
devuelve solo la primera coincidencia encontrada, mientras que las"string".match()
devuelve todas si usa lag
bandera en la expresión regular.Vea aquí: ejecutivo , partido .
fuente
Si su expresión regular es global y está capturando, debe usar exec. Match no devolverá todas tus capturas.
Match funciona muy bien cuando solo se combinan (no se capturan). Lo ejecutas una vez y te da una matriz de todas las coincidencias. (aunque si la expresión regular no es global, la coincidencia mostrará la coincidencia seguida de capturas)
Exec es lo que usa cuando está capturando, y cada vez que se ejecuta da la coincidencia, seguida de las capturas. (la coincidencia se comportará de manera que proporcione la coincidencia completa seguida de capturas, solo cuando la expresión regular no es global).
Otro uso con Exec es obtener el índice o la posición de una coincidencia. Cuando tenga una variable para su expresión regular, puede usar .lastIndex y obtener la posición de la coincidencia. Un objeto regex tiene .lastIndex, y el objeto regex es en lo que haces .exec. La coincidencia de puntos se realiza en una cadena y no podrá hacer el objeto de expresión regular dot lastIndex
Una cadena, tiene la función de coincidencia, a la que se le pasa una expresión regular. Y una expresión regular, tiene la función exec y se le pasa una cadena
ejecutivo que ejecuta varias veces. partido corres una vez
Es bueno usar la coincidencia cuando no se captura y al capturar puede usar exec, que es más poderoso, ya que es bueno para obtener capturas, pero si usó la coincidencia al capturar, vea que muestra capturas cuando la expresión regular no es global, pero no muestra capturas cuando la expresión regular es global.
Otra cosa es que si usa exec, tenga en cuenta que se llama en la expresión regular, entonces si usó una variable para la expresión regular, tiene más poder
No obtienes las coincidencias cuando no usas la variable para la expresión regular, así que usa la variable para la expresión regular, cuando usas exec
Y con el ejecutivo, puede obtener el "índice" de la coincidencia.
Entonces, si desea índices o captura, use exec (tenga en cuenta que, como puede ver, con el "índice", el "índice" que da es realmente una enésima aparición, cuenta desde 1. Por lo tanto, podría derivar el index al restar 1. Y como puede ver, da 0 - lastIndex de 0 - para no encontrado).
Y si desea estirar la coincidencia, puede usarla cuando está capturando, pero no cuando la expresión regular es global, y cuando lo hace para eso, entonces el contenido de la matriz no es todas las coincidencias, pero es el completo partido seguido de las capturas.
fuente
r.lastIndex
es el factor clave para comprender la diferencia entreexec
ymatch
.If your regex is global, and you are capturing, then you must use exec. Match won't return all your captures.
lo tengo en la consola. Simplemente copie / pegue"a,b,c,aa,bb,cc".match(/(\w+)/g);
Opera, Firefox."a,b,c,aa,bb,cc".match(/(\w+)/g)
Lo que está sucediendo allí muestra todas las coincidencias, y da la casualidad de que capturaste todas las coincidencias, así que si mostrara todas las capturas, se vería exactamente igual (cntd)El .match () la función
str.match(regexp)
hará lo siguiente:g
bandera se usa en la expresión regular: devolverá todas las subcadenas (ignorando los grupos de captura)g
bandera no se usa en la expresión regular: devolverá lo mismo queregexp.exec(str)
null
Ejemplos de .match () usando la
g
bandera:Y .match () sin la
g
bandera es equivalente a .exec () :El .exec () la función
regexp.exec(str)
hará lo siguiente:g
bandera se usa en la expresión regular: devolverá (por cada vez que se llame) :[N_MatchedStr, N_Captured1, N_Captured2, ...]
de la próximaN
coincidencia. Importante: no avanzará a la siguiente coincidencia si el objeto regexp no está almacenado en una variable (debe ser el mismo objeto)g
bandera no se usa en la expresión regular: devolverá lo mismo que si tuviera unag
bandera y se llamara por primera vez y solo una vez.null
Ejemplo de .exec () (regexp almacenado + usando la
g
bandera = cambia con cada llamada):Ejemplos de .exec () cuando no cambia con cada llamada:
fuente
A veces, regex.exec () tardará mucho más tiempo que string.match ().
Vale la pena mencionar que si el resultado de string.match () y regex.exec () es el mismo (por ejemplo, cuando no se usa el indicador \ g), regex.exec () tomará entre x2 y x30 y luego string. partido():
Por lo tanto, en tales casos, el uso del enfoque de "new RegExp (). Exec ()" debe usarse solo cuando necesite una expresión regular global (es decir, para ejecutar más de una vez).
fuente