Регулярное выражение для сопоставления комментариев, отличных от javadoc, в Eclipse

Я пытаюсь написать регулярное выражение, которое соответствует комментариям (non-javadoc) в формате

/*
 * (non-javadoc)
 *
 * some other comment here
 *
 */

Пока у меня есть (?s)/\*\R.*?non-Javadoc.*?\*/, но на самом деле это слишком много совпадений. У меня есть заголовок в верхней части моего файла, что-то вроде

/*
 * header text
 */
 public class MyClass {

 }

и он соответствует /* в верхней части файла, но я действительно хочу только соответствовать сгенерированному комментарию (non-javadoc). Может ли кто-нибудь помочь мне исправить это регулярное выражение?

РЕДАКТИРОВАТЬ: я пытаюсь использовать диалоговое окно Eclipse Find/Replace, но я открыт для использования внешних инструментов, если это необходимо.


person Jeff Storey    schedule 31.05.2011    source источник
comment
Не знаю, что это за язык, но это может быть PHP и в этом случае используйте Tokenizer.   -  person KingCrunch    schedule 01.06.2011
comment
@KingCrunch, он использует поиск/замену Eclipse   -  person Jeff Storey    schedule 01.06.2011
comment
(+1) за вопрос, так как я также просто выслеживаю этот уродливый код с нулевой информацией в Eclipse... :(   -  person Tom Fink    schedule 19.03.2015


Ответы (2)


Это должно сделать это:

(?s)/\*[^*](?:(?!\*/).)*\(non-javadoc\)(?:(?!\*/).)*\*/

/\*[^*] соответствует началу комментария в стиле C (/* */), но не соответствует комментарию JavaDoc (/** */)

(?!\*/). соответствует любому одиночному символу, если только он не является началом последовательности */. Поиск (?:(?!\*/).)* вместо .*? делает невозможным совпадение, начинающееся в одном комментарии и заканчивающееся в другом.

ОБНОВЛЕНИЕ: В (запоздалом) ответе на комментарий Яцека: да, вы, вероятно, захотите добавить что-то в конец регулярного выражения, чтобы вы могли заменить его пустой строкой и не оставить много пустых строк в вашем коде. Но решение Яцека сложнее, чем должно быть. Все, что вам нужно добавить, это \s*

Управляющая последовательность \R соответствует многим типам новой строки, включая разделитель строк Unicode (\u2028) и разделитель абзацев (\u2029), а также последовательность возврата каретки и перевода строки DOS/сети (\r\n). Но это все пробельные символы, поэтому \s соответствует им (по крайней мере, в Eclipse; согласно документам эквивалентно [\t\n\f\r\p{Z}]).

\s* в добавлении Яцека предназначалось только для соответствия любым горизонтальным пробелам (пробелам или табуляциям), которые могли существовать перед новой строкой, плюс отступ после нее. (Вы должны удалить его, потому что вы не удаляете отступ перед первой строкой комментария.) Но оказывается, что \s* может выполнить всю работу:

(?s)/\*[^*](?:(?!\*/).)*\(non-javadoc\)(?:(?!\*/).)*\*/\s*
person Alan Moore    schedule 01.06.2011
comment
Также было бы хорошо добавить (\s*)\R(\s*) в конце приведенного выше регулярного выражения, чтобы включить следующие символы разрыва строки и отступа. В противном случае замена пустой строкой оставит пустую строку вместо каждого комментария. - person Jacek Kołodziejczyk; 30.07.2011
comment
Кто-то был достаточно сильно настроен по этому поводу, чтобы отредактировать добавление Яцека в мое регулярное выражение. Я благодарю рецензентов, которые отклонили это редактирование, и спасибо, @Tom, за то, что обратили мое внимание на этот неполный ответ. - person Alan Moore; 19.03.2015

В Perl это будет выглядеть так

/
   \/\*
   (?: (?! \*\/ ) . )*
   non-javadoc
   (?: (?! \*\/ ) . )*
   \*\/
/sx
person ikegami    schedule 31.05.2011
comment
Я должен был указать, что он использует поиск/замену Eclipse - person Jeff Storey; 01.06.2011