2012-03-20 28 views
9

Sono nuovo di regex. Sto cercando di analizzare tutti i contenuti all'interno di parentesi graffe in una stringa. Ho cercato this post come riferimento e ho fatto esattamente come suggerito una delle risposte, tuttavia il risultato è inaspettato.javascript, regex analizza il contenuto della stringa tra parentesi graffe

Ecco quello che ho fatto

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"] 

penso che mi manca qualcosa, che cosa sto facendo male?

aggiornamento

ero in grado di farlo con /g per una ricerca globale

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

come posso ottenere la stringa w/o staffe?

risposta

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

produce

["string1", "string2"] 

Si presume che ogni } ha un corrispondente { prima e {...} sezioni non nido. Inoltre, non acquisirà il contenuto delle sezioni vuote {}.

+0

fantastico, proprio quello che volevo –

+3

Questo è buono. Ma non è necessario sfuggire alla parentesi di chiusura. '/ [^ {}] + (? =})/G' – Kash

0

Questo risultato:

["{string1}", "string1"] 

sta mostrando che, per la prima partita, l'intera espressione regolare abbinato "{string1}" e le prime parentesi di cattura abbinato "string1".

Se si desidera ottenere tutte le partite e vedere tutte le parentesi di cattura di ogni partita, è possibile utilizzare il flag "g" e scorrere, chiamando exec() più volte come questo:

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"] 

Lo si può vedere lavorare qui: http://jsfiddle.net/jfriend00/sapfm/

+0

incarico in una condizione ... non la mia tazza di tè. – jbabey

+0

È un modo efficiente per eseguire questo tipo di ciclo e in qualche modo comune per questo scopo esatto.Lo eviterei anche in generale, tranne che in questo tipo di casi. Puoi prendere un paio di linee di codice per realizzare la stessa cosa senza di esso, se vuoi. – jfriend00

+0

grazie per la spiegazione, mi chiedevo perché la stessa stringa appariva due volte. grazie! –

1

Prova questa:

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 buon posto per leggere su Regex in JavaScript è here, e un bel plac e al test è here

buona fortuna!

+0

Non credo che g farebbe la differenza qui. Non sta ottenendo la seconda corrispondenza (stringa2) perché chiama exec solo una volta. – Kash

+0

@Kash hai ragione, ma ho chiamato match, e senza il g, restituirà '[" {stringa1} "," stringa1 "]' – NicoSantangelo

+0

grande risorsa di apprendimento regex, grazie mille –

0

Niente di sbagliato. Ma avrai bisogno di guardare i tuoi gruppi di cattura (il secondo elemento dell'array) per ottenere il contenuto che desideri (puoi ignorare il primo). Per ottenere tutte le occorrenze, non è sufficiente eseguire exec una volta, sarà necessario eseguire il loop dei risultati utilizzando match.

Modifica: non importa che, afaik, non è possibile accedere ai gruppi di acquisizione con match. Una soluzione più semplice sarebbe utilizzare un lookahead positivo, come 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); 
Problemi correlati