2010-03-16 13 views

Odpowiedz

12

kropka łapie wszystko poza nowymi liniami .. (jeśli dotall jest fałszywy)

więc albo użyć dotall (jak wspomniano w innych odpowiedzi/komentarze to nie jest obsługiwane w javascript, ale będę zostawić go tutaj dla odniesienia)

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

lub dodać białe znaki znaki \s w swoich wyrażeń

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

Alan wspomniał w swoim komentarzu złą wydajność z odpowiedzią Dałem więc używać następujących zamiast .. (co przekłada się wszystkiego spacje i wszystko bez spacji, więc wszystko ..)

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

Jest tryb nie 's' (pojedyncza linia) w JavaScript, a' (. \ S |) 'sądy katastrofalne wycofywania. Standardowy sposób na dopasowanie wszystkiego - w tym - nowe linie w JS to '[\ S \ s]'. –

+0

@alan, wszelkie linki dotyczące powrotu '\ s | .'? chciałbym dowiedzieć się więcej na ten temat .. –

+1

Erik Corry wyjaśnił to dobrze tutaj: http://stackoverflow.com/questions/2407870/javascript-regex-hangs-using-v8/2408599#2408599 Dla bardziej ogólnej dyskusji o katastroficznym cofaniu , zobacz http://www.regular-expressions.info/catastrophic.html –

4

dwa problemy:

  1. w JavaScript, nie ma modyfikator dotall. Będziesz musiał użyć hacka, aby umożliwić dopasowywanie nowych linii, takich jak używanie [^].
  2. Używasz chciwego dopasowywania. Jeśli w twoim wejściu jest wiele komentarzy, wszystko pomiędzy nimi zostanie zjedzone.

Rozwiązanie:

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

Przykład:

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

+1, zmieniony na nie chciwy .. –

+0

Nie działa z zagnieżdżonymi komentarzami. Spróbuj: "/ * abc/* xyz */def/*". Nienagiczna natura sprawia, że ​​pasuje do pierwszego komentarza początkowego z komentarzem do pierwszego końca, a następnie pozostaje tylko "def ". – InfinitiesLoop

+0

Nigdy nie myśl, zagnieżdżone komentarze nie są faktycznie dozwolone w ten sposób. Ta wewnętrzna zakończy zewnętrzną. – InfinitiesLoop

Powiązane problemy