Estoy tratando de analizar cadenas codificadas por URL que están formadas por pares clave = valor separados por uno &o por otro &.
Lo siguiente solo coincidirá con la primera aparición, separando las claves y los valores en elementos de resultados separados:
var result = mystring.match(/(?:&|&)?([^=]+)=([^&]+)/)
Los resultados para la cadena '1111342 = Adam% 20Franco & 348572 = Bob% 20Jones' serían:
['1111342', 'Adam%20Franco']
El uso del indicador global, 'g', coincidirá con todas las ocurrencias, pero solo devolverá las subcadenas totalmente coincidentes, no las claves y valores separados:
var result = mystring.match(/(?:&|&)?([^=]+)=([^&]+)/g)
Los resultados para la cadena '1111342 = Adam% 20Franco & 348572 = Bob% 20Jones' serían:
['1111342=Adam%20Franco', '&348572=Bob%20Jones']
Si bien podría dividir la cadena &y separar cada par clave / valor individualmente, ¿hay alguna forma de usar el soporte de expresión regular de JavaScript para que coincida con múltiples ocurrencias del patrón /(?:&|&)?([^=]+)=([^&]+)/similar a la preg_match_all()función de PHP ?
Estoy buscando una forma de obtener resultados con los sub-partidos separados como:
[['1111342', '348572'], ['Adam%20Franco', 'Bob%20Jones']]
o
[['1111342', 'Adam%20Franco'], ['348572', 'Bob%20Jones']]
fuente

replaceaquí.var data = {}; mystring.replace(/(?:&|&)?([^=]+)=([^&]+)/g, function(a,b,c,d) { data[c] = d; });hecho. "matchAll" en JavaScript es "reemplazar" con una función de controlador de reemplazo en lugar de una cadena.Respuestas:
Izado de los comentarios
El soporte del navegador se enumera aquí https://caniuse.com/#feat=urlsearchparams
Sugeriría una expresión regular alternativa, usando subgrupos para capturar el nombre y el valor de los parámetros individualmente y
re.exec():resultes un objeto:{ f: "q" geocódigo: "" hl: "de" es decir: "UTF8" iwloc: "addr" ll: "50.116616,8.680573" q: "Frankfurt am Main" sll: "50.106047,8.679886" fuente: "s_q" spn: "0.35972,0.833588" sspn: "0.370369,0.833588" z: "11" }La expresión regular se descompone de la siguiente manera:
(?: # grupo no capturador \? | & # "?" o "&" (?:amperio;)? # (permitir "& amp;", para URL codificadas HTML incorrectamente) ) # finaliza el grupo sin captura ( # grupo 1 [^ = & #] + # cualquier carácter excepto "=", "&" o "#"; al menos una vez ) # fin grupo 1 - este será el nombre del parámetro (?: # grupo no capturador =? # an "=", opcional ( # Grupo 2 [^ & #] * # cualquier carácter excepto "&" o "#"; cualquier cantidad de veces ) # fin grupo 2 - este será el valor del parámetro ) # finaliza el grupo sin capturafuente
x = ysería asignaryaxy también produceny). Cuando aplicamos ese conocimiento aif (match = re.exec(url)): Esta A) realiza la asignación y B) devuelve el resultado dere.exec(url)awhile. Ahorare.execvuelvenullsi no hay coincidencia, que es un valor falso. En efecto, el ciclo continuará mientras haya una coincidencia.Necesita usar el interruptor 'g' para una búsqueda global
fuente
2020 editar
Use URLSearchParams , ya que este trabajo ya no requiere ningún tipo de código personalizado. Los navegadores pueden hacer esto por usted con un solo constructor:
rendimientos
Así que ya no hay razón para usar regex para esto.
Respuesta original
Si no desea confiar en la "coincidencia ciega" que viene con la
execcoincidencia de estilo de ejecución , JavaScript viene con la funcionalidad de coincidencia integrada, pero es parte de lareplacellamada a la función, cuando se usa "qué hacer con la captura grupos " función de manejo :hecho.
En lugar de utilizar la función de manejo de grupos de captura para devolver cadenas de reemplazo (para el manejo de reemplazo, el primer argumento es la coincidencia de patrón completo, y los argumentos posteriores son grupos de captura individuales) simplemente tomamos las capturas de los grupos 2 y 3, y almacenamos ese par en caché.
Por lo tanto, en lugar de escribir funciones de análisis complicadas, recuerde que la función "matchAll" en JavaScript es simplemente "reemplazar" con una función de controlador de reemplazo, y se puede tener mucha eficiencia de coincidencia de patrones.
fuente
something "this one" and "that one". Quiero colocar todas las cadenas entre comillas dobles en una lista, es decir [esta, esa]. Hasta ahoramystring.match(/"(.*?)"/)funciona bien para detectar el primero, pero no sé cómo adaptar su solución para un solo grupo de captura.Para capturar grupos, estoy acostumbrado a usar
preg_match_allen PHP y he intentado replicar su funcionalidad aquí:fuente
/glo queexec()se ejecuta de lo contrario no cambiará el índice actual y se repetirá para siempre.Establezca el
gmodificador para una coincidencia global:fuente
Fuente:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec
Encontrar coincidencias sucesivas
Si su expresión regular usa la bandera "g", puede usar el método exec () varias veces para encontrar coincidencias sucesivas en la misma cadena. Cuando lo hace, la búsqueda comienza en la subcadena de str especificada por la propiedad lastIndex de la expresión regular (test () también avanzará la propiedad lastIndex). Por ejemplo, suponga que tiene este script:
Este script muestra el siguiente texto:
Nota: No coloque el literal de expresión regular (o el constructor RegExp) dentro de la condición while o creará un bucle infinito si hay una coincidencia debido a que la propiedad lastIndex se restablece en cada iteración. También asegúrese de que el indicador global esté configurado o de que también se produzca un bucle.
fuente
String.prototype.matchcon lagbandera:'abbcdefabh'.match(/ab*/g)retornos['abb', 'ab']Si alguien (como yo) necesita el método de Tomalak con soporte de matriz (es decir, selección múltiple), aquí está:
entrada
?my=1&my=2&my=thingsresultado
1,2,things(solo devuelto anteriormente: cosas)fuente
Solo para seguir con la pregunta propuesta como lo indica el título, puede iterar sobre cada coincidencia en una cadena usando
String.prototype.replace(). Por ejemplo, lo siguiente hace exactamente eso para obtener una matriz de todas las palabras basadas en una expresión regular:Si quisiera obtener grupos de captura o incluso el índice de cada partido, también podría hacerlo. A continuación se muestra cómo se devuelve cada coincidencia con la coincidencia completa, el primer grupo de captura y el índice:
Después de ejecutar lo anterior,
wordsserá el siguiente:Para hacer coincidir múltiples ocurrencias similares a las que están disponibles en PHP
preg_match_all, puede usar este tipo de pensamiento para hacer las suyas o usar algo comoYourJS.matchAll(). YourJS define más o menos esta función de la siguiente manera:fuente
YourJS.parseQS()( yourjs.com/snippets/56 ), aunque muchas otras bibliotecas también ofrecen esta funcionalidad.Si puede salirse con la suya,
mapesta es una solución de cuatro líneas:No es bonito, no es eficiente, pero al menos es compacto. ;)
fuente
Uso
window.URL:fuente
Hola desde 2020. Permítanme llamar su atención sobre String.prototype.matchAll () :
Salidas:
fuente
Para capturar varios parámetros con el mismo nombre, modifiqué el ciclo while en el método de Tomalak de esta manera:
entrada:
?firstname=george&lastname=bush&firstname=bill&lastname=clintondevoluciones:
{firstname : ["george", "bill"], lastname : ["bush", "clinton"]}fuente
?cinema=1234&film=12&film=34esperar{cinema: 1234, film: [12, 34]}. Editó su respuesta para reflejar esto.Bueno ... tuve un problema similar ... Quiero una búsqueda incremental / por pasos con RegExp (por ejemplo: iniciar búsqueda ... hacer un poco de procesamiento ... continuar la búsqueda hasta la última coincidencia)
Después de muchas búsquedas en Internet ... como siempre (esto se está convirtiendo en un hábito ahora) termino en StackOverflow y encontré la respuesta ...
Lo que no se refiere y lo que hay que mencionar es "
lastIndex" Ahora entiendo por qué el objeto RegExp implementa lalastIndexpropiedad " "fuente
Dividirlo me parece la mejor opción:
fuente
Para evitar el infierno de expresiones regulares, puedes encontrar tu primer partido, corta un trozo e intenta encontrar el siguiente en la subcadena. En C # esto se parece a esto, lo siento, no lo he portado a JavaScript para usted.
fuente