2012-02-22 22 views
6

Quiero encontrar cualquier llamada al método en el código dado. Así que estoy dividiendo código con punto y coma como delimitador. Así que al final estoy interesado en encontrar nombres de métodos que han sido llamados en un código dado. Necesito una expresión regular para que coincida con el patrón de llamada al método. ¡¡Por favor ayuda!!Regex para buscar llamadas al método

+0

Si quiere una solución correcta, entonces la respuesta es: es prácticamente imposible. – biziclop

+2

No solo práctico, sino incluso teórico. Java (el idioma) no es un lenguaje regular, por lo que no puede ser analizado por expresiones regulares. –

+1

De acuerdo; esto es increíblemente desordenado Tendría que coincidir: llamadas de funciones desnudas y llamadas a funciones en instancias pero no definiciones de funciones. Además, ¿qué harías con las llamadas a funciones anidadas en llamadas a funciones, p. 'map.get (map.get (123))'? Ugh. – beerbajay

Respuesta

0

Una vez tuve que averiguar si una cadena contiene una llamada al método Java (incluidos los nombres de métodos que contienen caracteres que no son ASCII).

Lo siguiente funcionó bastante bien para mí, aunque también encuentra llamadas de constructor. Espero eso ayude.

/** 
* 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; 
} 
1

Para llamadas calificados {es decir, pide en esta forma: [nomObjeto | className] .methodName (..)}, He estado usando:

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

Cuando las llamadas no cualificados están presentes { es decir, las llamadas en esta forma: methodName (..)}, he estado usando:

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

Aunque, esto también encontrará constructores.

0
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)); 
    } 
} 
+1

En general, es una buena idea agregar algún tipo de descripción de cómo este código resuelve el problema dado. Por favor [edite] su respuesta para agregar tal descripción. –

Cuestiones relacionadas