2010-03-16 3 views

ответ

12

точка ловит все, за исключением переводов строк .. (если dotall ложно)

так либо использовать dotall (, как указано в других ответах/комментариев это не поддерживается в JavaScript, но я буду оставить его здесь для справки)

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

или добавить символы разметки \s в выражениях

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

Алан отметил в своем комментарии плохой производительности ответ я дал так использовать следующие вместо .. (который переводит на все пробелы и все без пробелов, поэтому все ..)

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

Там нет режима 's' (однострочного) в JavaScript, и' (. \ S |) 'суды катастрофических возвраты. Стандартный способ сопоставить что-нибудь, включая строки новой строки в JS, - '[\ S \ s]'. –

+0

@alan, любые ссылки о '\ s | .' backtracking? хотел бы узнать об этом подробнее .. –

+1

Эрик Корри объяснил это здесь: http://stackoverflow.com/questions/2407870/javascript-regex-hangs-using-v8/2408599#2408599 Для более общей дискуссии о катастрофическом обратном следе , см. http://www.regular-expressions.info/catastrophic.html –

4

Две проблемы:

  1. В JavaScript нет модификатора dotall. Вам придется использовать хак, чтобы разрешить совпадение строк новой строки, например, с использованием [^].
  2. Вы используете жадное соответствие. Если на вашем входе есть несколько комментариев, все между ними будет съедено.

Решение:

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

Пример:

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

+1, изменено, чтобы не жадно .. –

+0

Не работает с вложенными комментариями. Попробуйте: '/ * abc/* xyz */def/*'. Нежелательная природа делает его совпадением с первым комментарием первого комментария, а затем остается только «def ». – InfinitiesLoop

+0

Никогда, ваши вложенные комментарии на самом деле не разрешены таким образом. Внутренняя оболочка будет нарушать внешнюю. – InfinitiesLoop

Смежные вопросы