Если бы я делал это, я просто написал бы некоторый код, чтобы игнорировать комментарии. Начните игнорировать, когда вы видите / *, и возобновите синтаксический анализ при обнаружении * /.
. Для // вы можете видеть, меньше ли индекс строки "//" в строке, чем индекс "для",Если это не считать для.
Причина, по которой я бы сделал это таким образом, заключается в том, что вы можете столкнуться с чем-то вроде следующего:
/*
for (int i = 0; i <= 10; i = i + 2) {
System.out.println(i);
}
*/
Если вы читаете во всех строкахпрограммы как одной большой строки, а затем обработать ее так, как вы можете сделать это
// Note: Java 13 text block
String program = """
//This is a for loop
for (int i = 0; i <= 10; i = i + 2) {
System.out.println(i);
}
/*
When you know exactly how many times you want to loop through a block of code, use
the for loop instead of a while loop
*/
""";
- Первый
replaceAll
удаляет все комментарии типа / *. - Второй
replaceAll
удаляет однострочные комментарии до конца строки - (? S) - это флаг, указывающий разрешенные многострочные совпадения.
program = program.replaceAll("(?s)/\\*.*\\*/", "")
.replaceAll("^(?s)(.*?)//.*?\n","$1");
int forCount = 0;
int idx = 0;
while ((idx = program.indexOf("for")) >= 0) {
forCount++;
program = program.substring(idx+1);
}
System.out.println(forCount + " occurence of for found");
Печать
1 вхождение для найденного
Примечание. Вышесказанное работает в крайнем случае, но не очень эффективно и не полно.
Рассмотрим следующий допустимый синтаксис.
for
(
int intfor = 10;
intfor < 20;
intfor++
) {}
или
String text = "what is the formula?";
Мой метод не поможет описанному выше. Изящное регулярное выражение может решить эту проблему, но написание синтаксического анализатора для анализа кода на лету, а также разрешение на поиск всех ключевых слов Java было бы способом, и imho, нетривиальным.