Regex для поиска вызовов методов - PullRequest
6 голосов
/ 23 февраля 2012

Я хочу найти любой вызов метода в данном коде. Поэтому я разделяю код с точкой с запятой в качестве разделителя. Итак, в конце я заинтересован в поиске имен методов, которые были вызваны в данном коде. Мне нужно регулярное выражение, чтобы соответствовать шаблону вызова метода. Пожалуйста, помогите !!

Ответы [ 3 ]

1 голос
/ 25 августа 2014

Для квалифицированных вызовов {т.е. вызовов в этой форме: [имя_объекта | имя_класса]. Имя_метода (..)}, я использовал:

(\.[\s\n\r]*[\w]+)[\s\n\r]*(?=\(.*\))

Когда присутствуют неквалифицированные вызовы {т.е. вызовы в этой форме: methodName (..)}, я использую:

(?!\bif\b|\bfor\b|\bwhile\b|\bswitch\b|\btry\b|\bcatch\b)(\b[\w]+\b)[\s\n\r]*(?=\(.*\))

Хотя, это также найдет конструкторов.

0 голосов
/ 18 февраля 2017
File f=new File("Sample.java"); //Open a file
String s;
FileReader reader=new FileReader(f); 
BufferedReader br=new BufferedReader(reader); //Read file
while((s=br.readLine())!=null){
    String regex="\\s(\\w+)*\\(((\\w+)*?(,)?(\\w+)*?)*?\\)[^\\{]";
    Pattern funcPattern = Pattern.compile(regex);
    Matcher m = funcPattern.matcher(s); //Matcher is used to match pattern with string 
    if(m.find()){
        System.out.printf(group(0));
    }
}
0 голосов
/ 14 января 2014

Мне однажды пришлось выяснить, содержит ли строка вызов метода Java (включая имена методов, содержащие не-ASCII символы).

Следующее работает довольно хорошо для меня, хотя оно также находит вызовы конструктора. Надеюсь, это поможет.

/**
 * Matches strings like {@code obj.myMethod(params)} and
 * {@code if (something)} Remembers what's in front of the parentheses and
 * what's inside.
 * <p>
 * {@code (?U)} lets {@code \\w} also match non-ASCII letters.
 */
public static final Pattern PARENTHESES_REGEX = Pattern
        .compile("(?U)([.\\w]+)\\s*\\((.*)\\)");

/*
 * After these Java keywords may come an opening parenthesis.
 */
private static List<String> keyWordsBeforeParens = Arrays.asList("while", "for", "if",
        "try", "catch", "switch");

private static boolean containsMethodCall(final String s) {
    final Matcher matcher = PARENTHESES_REGEX.matcher(s);

    while (matcher.find()) {
        final String beforeParens = matcher.group(1);
        final String insideParens = matcher.group(2);
        if (keyWordsBeforeParens.contains(beforeParens)) {
            System.out.println("Keyword: " + beforeParens);
            return containsMethodCall(insideParens);
        } else {
            System.out.println("Method name: " + beforeParens);
            return true;
        }
    }
    return false;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...