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

#java #regex

#java #регулярное выражение

Вопрос:

Я новичок в регулярных выражениях, нахожу пустые операторы IF, используя это if[\s]*\([^\)]*\)[\s]*\{((/\*(.|[\r\n])*?\*/)|\s)*\} , и оно отлично работает с многострочными комментариями с пустыми операторами, но не находит однострочных комментариев. Он находит следующие сценарии

 if (true) {

        /*
         * fsdsddgd ddgdgdfg gdfgdgdfg gdfgdfg fgdfgfg
         */

        /*
         * fsdsddgd ddgdgdfg gdfgdgdfg gdfgdfg fgdfgfg
         */
    }

if (true) {


    }
 

Не найти приведенные ниже сценарии

 if (true) {
        // kavi
        // kamal
        // kamal
    }

    if (true) {
        // kavi
    }
 

пожалуйста, дайте мне ценные решения для этого.

Комментарии:

1. Это работа для вашей IDE. Какую среду IDE вы используете? Eclipse: Compiler / Errors / Empty

2. Обратите внимание, что вы не сможете заставить его работать, если у вас есть вложенные круглые скобки в вашем условии.

3. я не использую eclipse IDE. но я написал пример программы для обычной практики exp, но это кажется кошмаром.

4. мне также нужно найти отдельные комментарии. Поэтому, пожалуйста, направьте меня в регулярном выражении. Спасибо

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

Ответ №1:

Не самая лучшая идея, но если вам придется…

Как вы можете видеть в комментариях, мне не очень нравится эта идея, но, поскольку вы просили об этом, это будет работать с вашим вводом (см. Демонстрацию):

 ifs*([^{]*{(?:[ t]*//.*)?[ t]*(?:[rn]*[ t]*(?://.*)?)*[rn]*[ t]*(?://.*)?}
 
  • Это ifs*([^{]*{ подводит нас к открывающей скобке
  • Это (?:[ t]*//.*)?[ t]* приводит нас к концу строки, по пути сопоставляя необязательный комментарий
  • (?:[rn]*[ t]*(?://.*)?)* Соответствует серии строк с необязательными комментариями
  • Это [rn]*[ t]*(?://.*)?} подводит нас к финальной скобке.

Токены должны быть правильно экранированы, поэтому попробуйте этот код:

 List<String> matchList = new ArrayList<String>();
try {
    Pattern regex = Pattern.compile("if\s*\([^\{]*\{(?:[ t]*//.*)?[ t]*(?:[rn]*[ t]*(?://.*)?)*[rn]*[ t]*(?://.*)?}");
    Matcher regexMatcher = regex.matcher(subjectString);
    while (regexMatcher.find()) {
        matchList.add(regexMatcher.group());
    } 
} catch (PatternSyntaxException ex) {
    // Syntax error in the regular expression
}
 

иначе, если

В комментариях вы говорите, что, возможно, не захотите else if

В этом случае используйте это:

 (?<!else )ifs*([^{]*{(?:[ t]*//.*)?[ t]*(?:[rn]*[ t]*(?://.*)?)*[rn]*[ t]*(?://.*)?
 

В коде:

 List<String> matchList = new ArrayList<String>();
try {
    Pattern regex = Pattern.compile("(?<!else )if\s*\([^\{]*\{(?:[ t]*//.*)?[ t]*(?:[rn]*[ t]*(?://.*)?)*[rn]*[ t]*(?://.*)?");
    Matcher regexMatcher = regex.matcher(subjectString);
    while (regexMatcher.find()) {
        matchList.add(regexMatcher.group());
    } 
} catch (PatternSyntaxException ex) {
    // Syntax error in the regular expression
}
 

Дайте мне знать, если у вас есть вопросы!

Комментарии:

1. Ярлык класса h недоступен в Java -> [^Srn] или [ t] , возможно.

2. Вы уверены? RB доволен этим. Позвольте мне перепроверить.

3. regexplanet совсем не доволен. Похоже, оно доступно только для Java 8.

4. Привет, он не работает в коде Java. получение этой «незаконной / неподдерживаемой escape-последовательности вблизи индекса 19, если s*([^{]*{(?: h*//.*)?h*(?:[rn]*h*(?://.*)?) * [ r n] * h*(?://.*)?}» при этом соответствуя этому.

5. Это должно быть h , как предложил Caz. Отредактировал ответ, может вы попробуете новое регулярное выражение? ifs*([^{]*{(?:[ t]*//.*)?[ t]*(?:[rn]*[ t]*(?://.*)?)*[rn]*[ t]*(?://.*)?} Через мгновение я опубликую Java-код.