Как удалить комментарии из данной строки в Java? - PullRequest
0 голосов
/ 22 октября 2019

как удалить комментарии, начинающиеся с "//" и / /, * и т. Д.? Я не нашел каких-либо решений по переполнению стека, которые бы мне очень помогли, многие из них были далеко над моей головой, и я все еще в большинстве своем.

О чем я думал до сих пор:

for (int i = 0; i < length; i++) {
  for (j = i; j < length; j++) {
        if (obj.charAt(j) == '/' && obj.charAt(j + 1) == '/')

Но я не совсем уверен, как заменить слова, следующие за этими символами. И как закончить, когда остановить замену комментарием "//". С комментариями / *, по крайней мере, концептуально я знаю, что должен заменить все слова, пока не появится "* /". Хотя, опять же, я не уверен, как ограничить замену до этого момента. Для замены я подумал заменить charAt после второй "/" пустой строкой до .... где? Я не могу понять, где "закончить" замену.

Я рассмотрел несколько реализаций в стеке, но я действительно не понял. Любая помощь приветствуется, особенно если она на базовом уровне и понятна для тех, кто плохо разбирается в программировании!

Спасибо.

Ответы [ 2 ]

1 голос
/ 23 октября 2019

Я сделал нечто подобное с регулярным выражением (Java 9 +) :

// Checks for
// 1) Single char literal '"'
// 2) Single char literal '\"'
// 3) Strings; termination ignores \", \\\", ..., but allows ", \\", \\\\", ...
// 4) Single-line comment // ... to first \n
// 5) Multi-line comments /*[*] ... */
Pattern regex = Pattern.compile(
    "(?s)('\"'|'\\\"'|\".*?(?<!\\\\)(?:\\\\\\\\)*\"|//[^\n]*|/\\*.*?\\*/)");

// Assuming 'text' contains your java text
// Leaves 1,2,3) unchanged and replaces comments 4,5) with ""
// Need quoteReplacement to prevent matcher processing $ and \
String textWithoutComments = regex.matcher(text).replaceAll(
    m -> m.group().charAt(0) == '/' ? "" : Matcher.quoteReplacement(m.group()));

Если у вас нет Java 9+, вы можете использовать эту функцию замены:

String textWithoutComments = replaceAll(regex, text,
    m -> m.group().charAt(0) == '/' ? "" : m.group());
public static String replaceAll(Pattern p, String s,
    Function<MatchResult, String> replacer) {
    Matcher m = p.matcher(s);
    StringBuilder b = new StringBuilder();
    int lastStart = 0;
    while (m.find()) {
        String replacement = replacer.apply(m);
        b.append(s.substring(lastStart, m.start())).append(replacement);
        lastStart = m.end();
    }
    return b.append(s.substring(lastStart)).toString();
}

0 голосов
/ 23 октября 2019

Я не уверен, что вы используете IDE, такую ​​как IntelliJ или Eclipse, но вы можете сделать это без использования кода, если вы просто заинтересованы в удалении всех комментариев для проекта. Вы можете сделать это с помощью инструмента «Заменить в пути». Обратите внимание, как проверяется «Regex», что позволяет нам сопоставлять строки на основе регулярных выражений.

enter image description here

Эта конфигурация в инструменте удалит все строки, начинающиеся сa // и замените его пустой строкой.

Команда для доступа к этому на Mac: ctrl + shift + r.

...