2012-04-09 13 views
5

In dem folgenden Eingabestring:Regular Expression Anleitung benötigte für Javascript

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

ich alle Instanzen von {$SOMETHING_HERE} anzupassen versuchen, die von einem unescaped Backslash nicht vorangestellt.

Beispiel:

Ich will es {$SOMETHING} passen aber nicht \{$SOMETHING}.

Aber ich will es \\{$SOMETHING}

Versuche zum Spiel:

alle meine Versuche, so weit wird passen, was ich will, außer für Tags direkt nebeneinander wie {$SOMETHING}{$SOMETHING_ELSE}

Hier ist was ich gerade habe:

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); 

Welche Ausgänge:

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

Tor

ich es sein will:

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

Frage

Kann jemand mich in die richtige Richtung?

Antwort

1

Das hier Problem ist, dass Sie ein Lookbehind benötigen, die JavaScript regexs nicht

im Grunde müssen Sie „{was}, wenn es von einem doppelten Schrägstrich vorangestellt ist, aber nicht ein einziger Hieb $“, die sie unterstützen, was der Lookbehind tut es.

Sie können einfache Fälle von Lookbehinds nachahmen, aber nicht sicher, ob es in diesem Beispiel hilft. Probieren Sie es aus: http://blog.stevenlevithan.com/archives/mimic-lookbehind-javascript

bearbeiten Btw, ich glaube nicht, dass Sie eine ‚dumme Art und Weise‘ dies tun können, entweder weil, wenn Sie [^\\]\{ haben Sie jedes Zeichen, das nicht ein Backslash vor der Klammer ist . Du brauchst wirklich den Lookbehind, um das sauber zu machen.

Ansonsten können Sie tun

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

Dann einfach die Anzahl der Schrägstriche in den resultierenden Token zählen.

+0

Ich bin mir bewusst, dass ein Look-Behind ist, was ich brauche und dass Javascript sie nicht unterstützt. Ich habe noch nie einen gefälschten Lookbehind gemacht, aber ich werde den Link sehen! – nathanjosiah

+0

@nathanjosiah Ich habe meine Antwort mit mehr Informationen aktualisiert. – Griffin

+0

Danke für den Artikel! Genau das, was ich brauchte! Ich habe meine Lösung als Antwort veröffentlicht. – nathanjosiah

0

Dies scheint zu tun, was ich will:

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); 

Welche gibt:

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

Wenn alles andere fehlschlägt, Split, join/ersetzen Sie den Mist aus ihm heraus.

Hinweis: Der erste Split/Join ist eigentlich der Bereinigungsteil. Das tötet \ {< *>}

Auch ich habe nicht für die Sachen in den Klammern, da es Code dafür bereits.