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

execpara obtener todas las sub-selecciones.+no es necesario yamatchque devolverá todas las sub-expresiones..execsolo devuelve uno cada vez, por lo que tampoco lo necesita+.Respuestas:
execcon una expresión regular global está destinado a ser utilizado en un bucle, ya que aún recuperará todas las subexpresiones coincidentes. Entonces:String.matchhace 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 lagbandera 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.lastIndexes el factor clave para comprender la diferencia entreexecymatch.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:gbandera se usa en la expresión regular: devolverá todas las subcadenas (ignorando los grupos de captura)gbandera no se usa en la expresión regular: devolverá lo mismo queregexp.exec(str)nullEjemplos de .match () usando la
gbandera:Y .match () sin la
gbandera es equivalente a .exec () :El .exec () la función
regexp.exec(str)hará lo siguiente:gbandera se usa en la expresión regular: devolverá (por cada vez que se llame) :[N_MatchedStr, N_Captured1, N_Captured2, ...]de la próximaNcoincidencia. Importante: no avanzará a la siguiente coincidencia si el objeto regexp no está almacenado en una variable (debe ser el mismo objeto)gbandera no se usa en la expresión regular: devolverá lo mismo que si tuviera unagbandera y se llamara por primera vez y solo una vez.nullEjemplo de .exec () (regexp almacenado + usando la
gbandera = 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