2013-10-16 30 views
11

OK domanda regex, come estrarre un carattere NON tra due caratteri, in questo caso parentesi.regex, estrai la stringa NOT tra due parentesi

Ho una stringa come: word1 | {word2 | word3} | parola 4

Voglio solo ottenere il primo e l'ultimo "pipe", non il secondo tra parentesi. Ho provato una miriade di tentativi con carati negativi e raggruppamenti negativi e non riesco a farlo funzionare.

Fondamentalmente sto usando questa espressione regolare in una funzione di divisione JavaScript per dividerla in un array contenente: "word1", "{word2 | word3}", "word4".

Qualsiasi assistenza sarebbe molto apprezzata!

+0

Cosa significa "barra"? Questo non è nel tuo esempio. –

+0

Che lingua o strumento stai usando? Puoi mostrarci qualcosa di ciò che hai provato? –

+0

@CarlNorum Significa 'word1' che precede la ** barra verticale **' | ':) –

risposta

17

On refiddle.com insieme a JavaScript, provare a utilizzare questo pattern

/\|(?![^{]*})/g 

con questo testo

word1 | {word2 | word3 } | word 4 | word 4 | {word2 | word3 } 

Questo dovrebbe corrispondere tutti i simboli tubi che non sono all'interno di {}.

+0

grazie subacqueo, questo ha fatto il trucco! –

12

dipende dalla lingua/implementazione si sta utilizzando, ma ...

\|(?![^{]*}) 

Questo corrisponde a un tubo che è non seguito da un }, tranne nel caso in cui un { viene prima.


Il (?! ...) è noto come asserzione lookahead negativo. Questo è più facile capire se si parte con una positiva affermazione lookAhead

\|(?=[^{]*}) 

Quanto sopra corrisponde solamente un tubo che è seguito da un } senza incontrare un primo {. Quando si nega che sostituendo il = con un !, la partita è ora solo successo se non c'è modo per caso positivo per essere vero (noto anche come il complemento ).

+0

Perché non limitarti a guardare avanti? – hwnd

+2

@hwnd - Hm, forse è possibile, ma non vedo un modo. Vuoi pubblicare quello che stai pensando? Sono curioso! –

+2

Grazie per la spiegazione. Quindi pochi di questi sono seguiti da spiegazioni. –

Problemi correlati