Regex для соответствия "не-Javadoc" комментарий в Eclipse - PullRequest
10 голосов
/ 01 июня 2011

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

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

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

/*
 * header text
 */
 public class MyClass {

 }

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

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

Ответы [ 2 ]

11 голосов
/ 01 июня 2011

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

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

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

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

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

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

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

(?s)/\*[^*](?:(?!\*/).)*\(non-javadoc\)(?:(?!\*/).)*\*/\s*
0 голосов
/ 01 июня 2011

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

/
   \/\*
   (?: (?! \*\/ ) . )*
   non-javadoc
   (?: (?! \*\/ ) . )*
   \*\/
/sx
...