2012-04-09 12 views
5

W poniższym ciągu wejściowego:Regular Expression Wytyczne potrzebne JavaScript

{$foo}foo bar \\{$blah1}oh{$blah2} even more{$blah3} but not{$blarg}{$why_not_me} 

Próbuję dopasować wszystkie instancje {$SOMETHING_HERE} które nie są poprzedzone odwrotnym ukośnikiem przed zmianą.

Przykład:

chcę dopasować {$SOMETHING} ale nie \{$SOMETHING}.

Ale ja chcę, aby dopasować \\{$SOMETHING}

Strzały:

wszystkich moich prób dotychczas będzie pasował do tego, co chcę z wyjątkiem tagów tuż obok siebie jak {$SOMETHING}{$SOMETHING_ELSE}

Tutaj to co aktualnie mam:

var input = '{$foo}foo bar \\{$blah1}oh{$blah2} even more{$blah3} but not{$blarg}{$why_not_me}'; 
var results = input.match(/(?:[^\\]|^)\{\$[a-zA-Z_][a-zA-Z0-9_]*\}/g); 
console.log(results); 

Które wyjścia:

["{$foo}", "h{$blah2}", "e{$blah3}", "t{$blarg}"] 

bramki

chcę go mieć:

["{$foo}", "{$blah2}", "{$blah3}", "{$blarg}", "{$why_not_me}"] 

Pytanie

Czy ktoś może wskazać mi w dobrym kierunku?

Odpowiedz

1

Problem polega na tym, że trzeba lookbehind, która JavaScript Regexs nie obsługują

zasadzie trzeba „$ {} czy cokolwiek to jest poprzedzone podwójnym ukośnikiem ale nie pojedynczy ukośnik”, która jest co wygląda tak.

Możesz naśladować proste przypadki lookbehindów, ale nie wiesz, czy to pomoże w tym przykładzie. Daj mu szansę: http://blog.stevenlevithan.com/archives/mimic-lookbehind-javascript

zmienił Btw, nie sądzę, można to za „głupi sposób” albo dlatego jeśli masz [^\\]\{ będziesz dowolny znak, który nie jest odwrotny ukośnik przed nawiasem zrobić . Naprawdę potrzebujesz lookbehind, aby zrobić to czysto.

W przeciwnym razie można zrobić

(\\*{\$[a-zA-Z_][a-zA-Z0-9_]*\}) 

Następnie wystarczy policzyć liczbę ukośniki w powstałym żetonów.

+0

Jestem świadomy, że brakuje mi tego, czego potrzebuję i że javascript ich nie obsługuje. Nigdy wcześniej nie robiłem fałszywego lookbehinda, ale sprawdzę link! – nathanjosiah

+0

@nathanjosiah Zaktualizowałem swoją odpowiedź z dodatkowymi informacjami. – Griffin

+0

Dzięki za artykuł! Dokładnie to, czego potrzebowałem! Przedstawiłem moje rozwiązanie jako odpowiedź. – nathanjosiah

0

To wydaje się robić to, co chcę:

var input = '{$foo}foo bar \\{$blah1}oh{$blah2} even more\\\\{$blah3} but not{$blarg}{$why_not_me}'; 

var results = []; 
input.replace(/(\\*)\{\$[a-z_][a-z0-9_]*\}/g, function($0,$1){ 
    $0 = $0.replace(/^\\\\/g,''); 
    var result = ($0.indexOf('\\') === 0 ? false : $0); 

    if(result) { 
     results.push(result); 
    } 
}) 

console.log(results); 

Co daje:

["{$foo}", "{$blah2}", "{$blah3}", "{$blarg}", "{$why_not_me}"] 
1

Kiedy wszystko inne zawiedzie, split, join/wymienić bzdura z tym.

Uwaga: pierwszy podział/łączenie jest w rzeczywistości częścią oczyszczania. To zabija \ {< *>}

Ponadto, nie uwzględniłem rzeczy w nawiasach, ponieważ jest już kod dla tego.

var input = '{$foo}foo bar \\{$blah1}oh{$blah2} even more\\\\{$blah3} but not{$blarg}{$why_not_me}'; 

input.split(/(?:[^\\])\\\{[^\}]*\}/).join('').replace(/\}[^\{]*\{/g,'},{').split(/,/)); 
Powiązane problemy