Tengo una cadena JS, digamos:
var testString = "words here, svg_icon('Var-1') svg_icon('Var_2'), and even more words here"; Entiendo cómo hacer coincidir la cadena en función de un valor fijo, por ejemplo, si quiero hacer coincidir en svg_icon :
var testString = "words here, svg_icon('Var-1','var_3') svg_icon('Var_2'), and even more words here"; var filterMatch = /(svg_icon)/; var results = testString.match(filterMatch); results.forEach((result) => { console.log(result); })Esto registra las 2 coincidencias que encuentra, que estoy esperando:
"svg_icon" "svg_icon"Lo que estoy tratando de hacer es hacer coincidir la expresión para que mi resultado sea:
"svg_icon('Var-1','var_3')" "svg_icon('Var_2')" Creo que esto es posible con las expresiones regulares, pero no puedo encontrar cómo lidiar con la combinación de condiciones al hacer coincidir los nombres cambiantes de "variable" (por ejemplo 'Var-1','var_3' y Var_2 ) que pueden contener caracteres especiales (solo guiones y guiones bajos ).
Cualquier ayuda sobre qué RegEx puedo usar en esta situación, o si esto es posible con tantas condiciones.
¡Gracias de antemano por cualquier consejo!
Haga coincidir el ( hasta ) después de svg_icon .
Debe usar el modificador g para que coincida varias veces. Solo está haciendo coincidir el primer svg_icon : obtiene dos salidas porque match[0] es la coincidencia completa y match[1] es el grupo de captura.
var testString = "words here, svg_icon('Var-1','var_3') svg_icon('Var_2'), and even more words here"; var filterMatch = /svg_icon\([^)]*\)/g; var results = testString.match(filterMatch); results.forEach((result) => { console.log(result); })¿Es esto lo que estás buscando?
svg_icon\('[vV][aA][rR][\-_]\d+'(?:,'[vV][aA][rR][\-_]\d+')*\)Cambie la expresión regular a /svg_icon.+?\)/g
https://regex101.com/r/3zBfDq/1
| Segmento | Sentido |
|---|---|
svg_icon | Coincide con el literal "svg_icon"... |
. | ...entonces cualquier cosa menos una nueva línea... |
+ | ...de una a una cantidad ilimitada de ocurrencias... |
?\) | ...hasta el primer paréntesis de cierre (se escapó con \ ). |
Agregue una bandera g lobal que se requiere para usar .matchAll() ( .match() en esteroides):
var testString = "words here, svg_icon('Var-1','var_3') svg_icon('Var_2'), and even more words here"; var filterMatch = /svg_icon.+?\)/g; var result = [...testString.matchAll(filterMatch)].flat(); console.log(`Result is an array of matches:`); console.log(result); console.log(`Access a single match like so:`); console.log(`First match is: result[0]`); console.log(result[0]); console.log(`Second match is: result[1]`) console.log(result[1]); .as-console-row::after { width: 0; font-size: 0; } .as-console-row-code { width: 100%; word-break: break-word; } .as-console-wrapper { min-height: 100% !important; min-width: 100%; } La firma es como .match() pero deberá envolver todo entre corchetes [] y usar el operador de extensión ... y luego aplanarlo con .flat() . El resultado es una serie de coincidencias.