#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-код.