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
replace
aquí.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()
:result
es un objeto:La expresión regular se descompone de la siguiente manera:
fuente
x = y
sería asignary
ax
y 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.exec
vuelvenull
si 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
exec
coincidencia de estilo de ejecución , JavaScript viene con la funcionalidad de coincidencia integrada, pero es parte de lareplace
llamada 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_all
en PHP y he intentado replicar su funcionalidad aquí:fuente
/g
lo queexec()
se ejecuta de lo contrario no cambiará el índice actual y se repetirá para siempre.Establezca el
g
modificador 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.match
con lag
bandera:'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=things
resultado
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,
words
será 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,
map
esta 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=clinton
devoluciones:
{firstname : ["george", "bill"], lastname : ["bush", "clinton"]}
fuente
?cinema=1234&film=12&film=34
esperar{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 lalastIndex
propiedad " "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