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
Respuesta
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;
}
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.
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));
}
}
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. –
- 1. regex para buscar la subcadena
- 2. sucesivas llamadas al método presentViewController de UIViewController
- 3. Cómo interceptar las llamadas al método dll?
- 4. Buscar funciones nunca llamadas
- 5. Jerarquía de llamadas al método Ruby
- 6. Llamadas al método de captura en Java
- 7. Reintentar llamadas al método de manera genérica
- 8. Llamadas al método de encadenamiento con
- 9. regex para buscar una cadena entre corchetes []
- 10. Debian para llamadas al sistema
- 11. Regex para el método String.matches de java?
- 12. ¿Cómo usar javascript regex para buscar campos de formulario "vacíos"?
- 13. Llamada al método privado que retiene la pila de llamadas
- 14. El mejor método para buscar datos jerárquicos
- 15. En .NET, ¿se optimizarán las llamadas al método vacío?
- 16. ¿Cómo se interceptan las llamadas al método de instancia?
- 17. Cómo buscar archivos según RegEx en C#
- 18. buscar y reemplazar con ruby regex
- 19. Llamadas de método en EL
- 20. Ruby Regex para redondear ceros al final
- 21. regex para al menos 2 espacios vacíos?
- 22. Buscar llamadas de métodos en el proyecto Eclipse
- 23. Llamar a un método anulado, superclase a llamadas reemplazadas método
- 24. RegEx para minimizar CSS
- 25. regex para n caracteres o al menos m caracteres
- 26. ¿Ruby proporciona un método para mostrar las llamadas de jerarquía?
- 27. Regex para hacer coincidir el contenido del método
- 28. Llamadas de Ajax al subdominio
- 29. Validar nombres de clase/método con regex
- 30. Llamadas al sistema en Windows
Si quiere una solución correcta, entonces la respuesta es: es prácticamente imposible. – biziclop
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. –
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