2012-04-09 11 views
5

Nel seguente stringa di input:Guidance Regular Expression necessario per Javascript

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

Sto cercando di abbinare tutte le istanze di {$SOMETHING_HERE} che non sono preceduti da un backslash non protetto.

Esempio:

lo voglio per abbinare {$SOMETHING} ma non \{$SOMETHING}.

Ma io lo voglio per abbinare \\{$SOMETHING}

Tentativi:

tutti i miei tentativi finora corrisponderà quello che voglio tranne che per tag accanto all'altro come {$SOMETHING}{$SOMETHING_ELSE}

Qui è quello che attualmente ho:

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

Quali uscite:

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

Goal

voglio che sia:

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

Domanda

nessuno mi può punto nella giusta direzione?

risposta

1

Il problema qui è che hai bisogno di una lookbehind, che JavaScript regexs non supportano

Fondamentalmente è necessario "$ {} qualunque se è preceduto da una doppia barra, ma non una singola barra" che è quello che fa il lookbehind.

È possibile simulare casi semplici di lookbehinds, ma non è sicuro se ciò sarà di aiuto in questo esempio. Dategli un andare: http://blog.stevenlevithan.com/archives/mimic-lookbehind-javascript

modificare Btw, non credo che si può fare questo un 'modo stupido' o perché se avete [^\\]\{ ti adattarsi a qualsiasi carattere che non è una barra inversa prima della parentesi . Hai davvero bisogno del lookbehind per farlo in modo pulito.

Altrimenti si può fare

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

Poi basta contare il numero di backslash nei gettoni risultanti.

+0

Sono consapevole che un look-behind è quello di cui ho bisogno e che il javascript non li supporta. Non ho mai fatto uno sguardo falso prima, ma controllerò il link! – nathanjosiah

+0

@nathanjosiah ho aggiornato la mia risposta con maggiori informazioni. – Griffin

+0

Grazie per l'articolo! Proprio quello di cui avevo bisogno! Ho pubblicato la mia soluzione come risposta. – nathanjosiah

0

Questo sembra fare quello che voglio:

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

Che dà:

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

Quando tutto il resto fallisce, dividere, unire/sostituire la merda fuori di esso.

Nota: il primo split/join è in realtà la porzione di pulizia. Questo uccide \ {< *>}

Inoltre, non ho tenuto conto delle cose all'interno delle parentesi poiché esiste già un codice.

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

input.split(/(?:[^\\])\\\{[^\}]*\}/).join('').replace(/\}[^\{]*\{/g,'},{').split(/,/)); 
Problemi correlati