2012-03-20 12 views
9

Jestem nowy, aby wyreperować. Próbuję parsować całą zawartość wewnątrz nawiasów klamrowych w ciągu znaków. Sprawdziłem jako odniesienie this post i zrobiłem dokładnie tak, jak sugeruje jedna z odpowiedzi, jednak wynik jest nieoczekiwany.javascript, regex parsować zawartość ciągu w nawiasach klamrowych

Oto co zrobiłem

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

Myślę, że jestem brakuje czegoś, co robię źle?

aktualizacja

udało mi się dostać z /g dla globalnego wyszukiwania

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

jaki sposób można uzyskać ciąg w/o nawiasach?

Odpowiedz

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

produkuje

["string1", "string2"] 

Zakłada ona, że ​​każdy } ma odpowiedni { przed i {...} sekcje nie gniazdo. Nie będzie również przechwytywał treści pustych sekcji {}.

+0

świetnie, właśnie tego chciałem –

+3

To jest dobre. Ale nie musisz uciekać z klamry zamykającej. '/ [^ {}] + (? =})/g' – Kash

0

Wynik:

["{string1}", "string1"] 

pokazuje, że w pierwszym meczu, cały regex dopasowane "{string1}" i pierwsze nawiasy Chwytając dopasowane "string1".

Jeśli chcesz uzyskać wszystkie mecze i zobaczyć wszystkie przechwytywanie parens każdego meczu, można użyć „g” flagi i Loop Through, nazywając exec() wielokrotnie tak:

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

Można go zobaczyć Pracujesz tutaj: http://jsfiddle.net/jfriend00/sapfm/

+0

zadanie w stanie ... nie moja filiżanka herbaty. – jbabey

+0

Jest to skuteczny sposób wykonywania tego typu pętli i dość powszechny w tym celu.Zasadniczo też tego unikam, z wyjątkiem tego typu przypadków. Możesz wziąć kilka kolejnych linii kodu, aby bez tego uzyskać tę samą rzecz, jeśli chcesz. – jfriend00

+0

dzięki za wyjaśnienie, zastanawiałem się, dlaczego ten sam napis pojawił się dwa razy. Dziękuję Ci! –

1

Spróbuj tego:

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 

dobre miejsce, aby przeczytać o regex w JavaScript jest here i ładny plac e do testu to here

powodzenia!

+0

Nie sądzę, że g miałoby tutaj znaczenie. Nie otrzymuje drugiego dopasowania (string2), ponieważ wywołuje exec tylko raz. – Kash

+0

@Kash masz rację, ale zadzwoniłem do matcha, a bez g, to zwróci '[" {string1} "," string1 "]' – NicoSantangelo

+0

świetny zasób do nauki regex, dziękuję bardzo –

0

Nic złego. Musisz jednak spojrzeć na grupy przechwytujące (drugi element w tablicy), aby uzyskać pożądaną zawartość (możesz zignorować pierwszą). Aby uzyskać wszystkie wystąpienia, nie wystarczy jednorazowo uruchomić aplikację exec, aby uzyskać wyniki z pętli, należy użyć match.

Edycja: nieważne, że nie można uzyskać dostępu do grup przechwytujących za pomocą match. Prostszym rozwiązaniem byłoby użycie dodatniej uprzedzającej, jak 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); 
Powiązane problemy