2012-08-29 8 views
8

Ho la mia espressione regolare /'(.*)(?:(?:'\s*,\s*)|(?:'\)))/
e il mio codice di prova ('He said, "You're cool."' , 'Rawr')
(Il mio codice di test simula parametri viene passato in una funzione.)

spiegherò la mia espressione regolare se ho capito bene e, auspicabilmente, alcuni di voi può far luce sul mio problema

1) /' significa all'inizio della stringa corrispondente, ci deve essere '

2) (.*) mezzi catturare qualsiasi carattere tranne \n 0 o più volte

3) (?:(?:4)|(?:5)) mezzi non catturano, ma cercano di eseguire il passaggio 4 e se non funziona passo try 5

4) (?:'\s*,\s*) mezzi non catturano ma ci deve essere un ' con 0 o più caratteri di spaziatura seguito da un , con 0 o più caratteri di spaziatura

5) (?:'\)) mezzi non catturano, ma ci deve essere ')

così sembra che si deve restituire il presente (e questo è quello che voglio):
' + He said, "You're cool." + ' ,
ma restituisce:
' + He said, "You're cool."' , 'Rawr + ')

Se cambio il mio codice di prova per ('He said, "You're cool."' , 'Rawr' (non finire parentesi) restituisce quello che voglio, ma non appena aggiungo che l'ultima parentesi, allora sembra che il mio operatore OR fa quello che vuole. Voglio testare prima se c'è una virgola, e rompere lì se ce n'è uno, e se non c'è un controllo per una parentesi.

Ho provato a cambiare gli spot del passaggio 4 e del passaggio 5, ma l'operatore OR sembra sempre predefinito sul lato (?:'\)). Come posso abbinare il minor numero possibile?RegExp - Come posso abbinare il minor numero possibile?

+0

L'inizio della stringa sarebbe '/ ^', non '/', fww. Personalmente non sono convinto che userò una regex per quello che stai cercando di fare, ma piuttosto un parser piccolo. Confondere le espressioni regolari è fonte di confusione. –

+0

@DaveNewton - Sì, lo so. Ecco perché ho detto all'inizio della stringa abbinata. Forse avrei dovuto dire all'inizio della porzione abbinata della stringa. O quando inizia la partita, deve iniziare con un '' '. – Aust

risposta

15

Non penso che il tuo problema sia l'operatore OR, ma lo greediness dello .*. Corrisponde alla stringa completa, quindi indietro -track fino a quando le seguenti espressioni corrispondono. La prima partita in questo processo di backtracking sarà 'He said, "You're cool."' , 'Rawr + '). Prova invece a .*?!

+1

Bergi sei un genio! Funziona perfettamente. :) Ti dispiace spiegare un po 'di più sul motivo per cui funziona? Non importa, ho capito dal tuo link. Grazie ancora. :) – Aust

+0

Puoi leggere http://stackoverflow.com/a/5319978/1048572 – Bergi

Problemi correlati