2010-03-16 11 views

risposta

12

il punto cattura tutto tranne a capo .. (se il dotall è falso)

quindi o utilizzare il dotall (come detto in altre risposte/commenti non è supportato in JavaScript, ma lo farò lasciarla qui per riferimento)

/\/\*(.*)\*\//gs 

o aggiungere i caratteri spazi bianchi \s nelle vostre espressioni

/\/\*((\s|.)*?)\*\//g 

Alan menzionato nel suo commento una cattiva performance della risposta che ho dato in modo da utilizzare il seguente invece .. (che si traduce in tutto gli spazi e tutto ciò non gli spazi bianchi, in modo tutto ..)

/\/\*([\s\S]*?)\*\//g 
+0

Non c'è modo di 's' (linea singola) in JavaScript, e' (. \ S |) 'campi backtracking catastrofica. Il modo standard per abbinare qualsiasi cosa, incluse le nuove in JS è '[\ S \ s]'. –

+0

@alan, qualsiasi link relativo al backtracking di '\ s | .'? Vorrei saperne di più ... –

+1

Erik Corry lo ha spiegato bene qui: http://stackoverflow.com/questions/2407870/javascript-regex-hangs-using-v8/2408599#2408599 Per una discussione più generale sul backtracking catastrofico , vedi http://www.regular-expressions.info/catastrophic.html –

4

due problemi:

  1. in JavaScript, non c'è il modificatore dotall. Dovrai utilizzare un trucco per consentire la corrispondenza di nuove righe, ad esempio utilizzando [^].
  2. Stai utilizzando una corrispondenza avida. Se ci sono più commenti nel tuo input, tutto ciò che li separa verrà mangiato.

Soluzione:

/\/\*[^]*?\*\//g 

Esempio:

> '/*abc\ncde*/qqq/*iop\n\njj*/'.replace(/\/\*[^]*?\*\//g, '') 
qqq 
+1

+1, modificato per non ingordo. –

+0

Non funziona con commenti annidati. Prova: '/ * abc/* xyz */def/*'. La natura non avida fa sì che corrisponda al 1 ° commento di inizio con il 1 ° commento finale, e poi c'è solo 'def ' a sinistra. – InfinitiesLoop

+0

I commenti nidificati non sono ammessi in questo modo. Quello interiore terminerà quello esterno. – InfinitiesLoop

Problemi correlati