2013-02-20 3 views
3

Я пытаюсь написать регулярное выражение, которое находит все комментарии в тексте. Например, между /* */. Пример:Регулярное выражение, чтобы удалить комментарий

/* Привет */

Когда я делаю это: /\*.*\*/, он ведет себя странно, и ничего не отображается. Что с этим не так?

EDIT: Комментарии могут быть распределены по нескольким линиям

+0

Это может быть, что '/' является разделителем регулярного выражения. Может быть, '/\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' – flec

+0

Также укажите язык, на который вы пытаетесь сделать это, и некоторый тестовый код. – Dukeling

+0

, который работает здесь, на каком языке вы используете? –

ответ

11

В отличие от примера размещена выше, вы пытаетесь соответствовать комментарии, которые натянуты несколько строк. По умолчанию . не соответствует разрыву строки. Таким образом, вы должны включить многострочный режим в регулярном выражении для соответствия многострочным комментариям.

Кроме того, вам, вероятно, необходимо использовать .*? вместо .*. В противном случае это сделает максимально возможное совпадение, которое будет между первым открытым комментарием и последним комментарием.

Я не знаю, как включить многострочный режим согласования в Sublime Text 2. Я не уверен, что он доступен как режим. Однако вы можете вставить разрыв строки в фактический шаблон с помощью CTRL + Enter. Таким образом, я хотел бы предложить эту альтернативу:

/\*(.|\n)*?\*/ 

Если Sublime Text 2 не распознает \n, можно альтернативно использовать CTRL + Enter, чтобы вставить разрыв строки в шаблоне, вместо \n.

+1

[Некоторые] (http://docs.sublimetext.info/en/latest/search_and_replace/search_and_replace_overview.html) [ссылки] (http://www.boost.org/doc/libs/1_47_0/libs/regex/doc /html/boost_regex/syntax/perl_syntax.html). – Dukeling

+0

Так что же будет в этом случае? – Jatin

+0

'/ \ * ([^ *] | [\ r \ n] | (\ * + ([^ * /] | [\ r \ n]))) * \ * + /' Это сделало работу – Jatin

5

Я столкнулся с этой проблемой несколько лет назад и wrote an entire article about it.

Если у вас нет доступа к нежадным соответствию (не все регулярные выражений библиотека поддерживает не жадную), то вы должны использовать это регулярное выражение:

Если у вас есть доступ к не жадному соответствию то вы можете использовать:

/\*(.|[\r\n])*?\*/ 

Также имейте в виду, что регулярные выражения - это всего лишь эвристика для этой проблемы. Регулярные выражения не поддерживают случаи, в которых что-то, как представляется, комментарий к регулярному выражению, но на самом деле это не так:

someString = "An example comment: /* example */"; 

// The comment around this code has been commented out. 
// /* 
some_code(); 
// */ 
0

Правильный ответ - это невозможно. Вы не можете написать регулярное выражение, которое могло бы правильно находить все комментарии или даже один тип комментариев - однострочный или многострочный.

Регулярные выражения могут обеспечивать только частичное совпадение, которое охватывало бы, возможно, 90% всех случаев, но это все.

Синтаксис для регулярного выражения является настолько сложным, что его можно правильно идентифицировать в 100% случаев, выполнив полную оценку выражения, которая, в свою очередь, основана на токенизации кода. Последнее представляет собой огромную задачу, которая сегодня реализуется всеми аналитиками АСТ. См. AST Explorer

Только правильно написанный анализатор АСТ может точно определить, где находятся все регулярные выражения в вашем коде. На этом вам придется написать парсер.

Или вы могли бы использовать одну из существующих библиотек, которые уже делают все это, например decomment.


примеры RegEx, где собирается любой лобовом подход к споткнуться, будучи не в состоянии сказать регулярное выражение из блока комментариев:

  • /\// - это будут думать, что р-ех один -линии комментарий
  • /\/*/ - это будут думать, что р-ех открывает многострочный комментарий
+0

Я не понимаю, почему это должно быть невозможно. Можете ли вы показать пример кода, который, по вашему мнению, нелегко обрабатывать? –

+0

Это правда, что это не так просто, без правильного парсера, но это, конечно, не «невозможно» на любом участке. Если вам просто нужно это для одноразовой задачи, вам проще написать нужные вам функции, а не развернуть полноразмерный парсер для вашего языка! – Thomas

+0

OP хочет совместить комментарии коментария * с помощью текстового редактора *. Совершенно разумная и полезная вещь. – 2017-04-06 11:36:31

0

Просто добавьте примечание об использовании regex для удаления комментариев внутри файла языка программирования.

Предупреждение!

Делая это, вы не должны забывать тот случай, когда у вас есть строка /* или */ внутри строки в коде - как var string = "/*"; - (мы никогда не знаем, если вы разбираете огромный код, который не ваш)!

Итак, лучше всего разобрать документ на языке программирования и иметь логическое значение для сохранения состояния открытой строки (и игнорировать любое совпадение внутри открытой строки).

Опять строка, заключенная в ", может содержать \", поэтому обратите внимание на регулярное выражение!

0

Просто хочу добавить для HTML Комментарии является это

\<!--(.|\n)*?--> 
Смежные вопросы