2012-03-20 8 views
9

soy nuevo en regex. Estoy tratando de analizar todo el contenido dentro de los corchetes en una cadena. Busqué this post como referencia e hice exactamente lo que sugiere una de las respuestas, sin embargo, el resultado es inesperado.JavaScript, regex analizar contenido de cadenas entre llaves

Esto es lo que hice

var abc = "test/abcd{string1}test{string2}test" //any string 
var regex = /{(.+?)}/ 
regex.exec(abc) // i got ["{string1}", "string1"] 
      //where i am expecting ["string1", "string2"] 

creo que me estoy perdiendo algo, lo que estoy haciendo mal?

actualización

yo era capaz de conseguir con /g para una búsqueda global

var regex = /{(.*?)}/g 
abc.match(regex) //gives ["{string1}", "{string2}"] 

¿Cómo puedo obtener la cadena w/o soportes?

Respuesta

17
"test/abcd{string1}test{string2}test".match(/[^{}]+(?=\})/g) 

produce

["string1", "string2"] 

Se asume que todos los } tiene un correspondiente { antes y {...} secciones no anidan. Tampoco capturará el contenido de las secciones {} vacías.

+0

genial, justo lo que quería –

+3

Esto es bueno. Pero no necesitas escapar del corsé de cierre. '/ [^ {}] + (? =})/g' – Kash

0

Este resultado:

["{string1}", "string1"] 

que está demostrando que para el primer partido, toda la expresión regular coincide "{string1}" y los primeros paréntesis de captura corresponde "string1".

Si desea obtener todos los partidos y ver todos los parens captura de cada partido, se puede utilizar la "g" de la bandera y el bucle a través, llamando exec() múltiples ocasiones como esta:

var abc = "test/abcd{string1}test{string2}test"; //any string 
var regex = /{(.+?)}/g; 
var match, results = []; 
while (match = regex.exec(abc)) { 
    results.push(match[1]); // save first captured parens sub-match into results array 
} 

// results == ["string1", "string2"] 

Se puede ver trabajar aquí: http://jsfiddle.net/jfriend00/sapfm/

+0

asignación en una condición ... no es mi taza de té. – jbabey

+0

Es una forma eficiente de hacer este tipo de ciclo y algo común para este propósito exacto.En general, también lo evitaría, excepto en este tipo de caso. Puede tomar un par de líneas más de código para lograr lo mismo sin él si lo desea. – jfriend00

+0

gracias por la explicación, me preguntaba por qué la misma secuencia apareció dos veces. ¡gracias! –

1

Prueba esto:

var abc = "test/abcd{string1}test{string2}test" //any string 
var regex = /{(.+?)}/g //g flag so the regex is global 
abc.match(regex) //find every match 

un buen lugar para leer sobre expresiones regulares en javascript es here, y un buen plac e para probar es here

buena suerte!

+0

No creo que g haga la diferencia aquí. No está obteniendo la segunda coincidencia (cadena2) porque llama a exec solo una vez. – Kash

+0

@Kash tienes razón, pero llame match, y sin el g, devolverá '[" {string1} "," string1 "]' – NicoSantangelo

+0

gran recurso de aprendizaje de expresiones regulares, muchas gracias –

0

Nada mal. Pero deberá mirar sus grupos de captura (el segundo elemento de la matriz) para obtener el contenido que desea (puede ignorar el primero). Para obtener todas las ocurrencias, no es suficiente ejecutar exec una vez, deberá recorrer los resultados usando match.

Editar: no obstante, afaik no puede acceder a los grupos de captura con match. Una solución más simple sería usar una anticipación positiva, como Mike Samuel suggested.

1
var abc = "test/abcd{string1}test{string2}test" //any string 
var regex = /{(.+?)}/g 
var matches; 

while(matches = regex.exec(abc)) 
    console.log(matches); 
Cuestiones relacionadas