- Мне нужно рекурсивно распечатать всю функцию, которая имеет параметр "HttpServletRequest"
Это регулярное выражение будет работать для вашего примера ( просмотреть результат ):
public.*?HttpServletRequest(?s).*?{.*?}
Мне нужно рекурсивно вывести всю функцию со строкой "getSession"
Это регулярное выражение будет работать для вашего примера ( просмотреть результат ):
public\s(?!class)(?s)[^}]+{[^}]+getSession[^}]+}
Как я уже говорил, эти регулярные выражения будут работать для вашего примера. Они, вероятно, больше не будут работать, если ваш код становится более сложным, например, содержит вложенные блоки кода внутри ваших функций.
Вы очень близки к синтаксическому анализу, если хотите, чтобы регулярное выражение было готово для каждого возможного фрагмента кода внутри твои функции. Вам нужно будет найти сбалансированные паратезы и многое другое. На мой взгляд, это было бы излишним для вашей проблемы. Вероятно, вам следует использовать синтаксический анализатор, который разделяет все функции, а затем вы можете go с регулярными выражениями, чтобы идентифицировать только нужные функции.
Пример использования регулярных выражений в PowerShell:
$content = Get-Content .\GetChallengeServlet.java -Raw
Select-String -InputObject $content -Pattern 'public.*?HttpServletRequest(?s).*?{.*?}' -AllMatches | ForEach-Object {$_.Matches.Value}
Вывод:
public void doGet(HttpServletRequest paramHttpServletRequest, HttpServletResponse paramHttpServletResponse) t
hrows ServletException, IOException {}
public void service(HttpServletRequest paramHttpServletRequest, HttpServletResponse paramHttpServletResponse)
throws ServletException, IOException {
/* 26 */ this.userName = null;
/* 27 */ String str1 = null;
/* 28 */ String str2 = null;
/* 29 */ HttpSession httpSession = paramHttpServletRequest.getSession(false);
/* 30 */ PrintWriter printWriter = null;
/* */ }
Подсказка, чтобы перейти к более сложным примерам, вместо того, чтобы действительно анализировать исходный код java, вы можете сделать обходной путь, подобный этому: Разделите ваши файлы на части (по сценарию, конечно)
- Разделить перед каждым определением класса, если ваши файлы могут содержать несколько определений класса
- Для каждого элемента класса, разделить перед каждым определением метода
После этого у вас будут более или менее единственные методы, и вам больше не придется определять их цели. Затем вы можете отфильтровать их по приведенным выше регулярным выражениям.
По-прежнему будет проблема: как насчет методов, которые вложены в методы? Будете ли вы заботиться о них? Это будет еще сложнее ...