2012-02-22 29 views
6

Tôi muốn tìm bất kỳ cuộc gọi phương thức nào trong mã đã cho. Vì vậy, tôi đang tách mã bằng dấu chấm phẩy làm dấu phân tách. Vì vậy, cuối cùng tôi quan tâm đến việc tìm kiếm tên của các phương thức đã được gọi trong mã đã cho. Tôi cần một biểu thức chính quy để khớp với mẫu gọi phương thức. Hãy giúp tôi!!Regex để tìm các cuộc gọi phương thức

+0

Nếu bạn muốn có giải pháp đúng thì câu trả lời là: thực tế là không thể. – biziclop

+2

Không chỉ thực tế, mà còn lý thuyết. Java (ngôn ngữ) không phải là ngôn ngữ thông thường nên không thể phân tích cú pháp bằng các biểu thức chính quy. –

+1

Đồng ý; điều này là vô cùng lộn xộn. Bạn sẽ phải khớp: các cuộc gọi hàm trần và các cuộc gọi hàm trên các cá thể chứ không phải các định nghĩa hàm. Ngoài ra, bạn sẽ làm gì với các cuộc gọi hàm lồng nhau trong các cuộc gọi hàm, ví dụ: 'map.get (map.get (123))'? Ugh. – beerbajay

Trả lời

0

Tôi đã từng phải tìm hiểu xem chuỗi có chứa cuộc gọi phương thức Java hay không (bao gồm cả tên phương thức chứa ký tự không phải ASCII).

Sau đây đã làm việc khá tốt đối với tôi, mặc dù nó cũng tìm thấy các cuộc gọi hàm tạo. Hy vọng nó giúp.

/** 
* 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

Đối với các cuộc gọi có trình độ {ví dụ, gọi theo hình thức này: [objectName | className] .methodName (..)}, Tôi đã sử dụng:

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

Khi cuộc gọi không đủ tiêu chuẩn có mặt { ví dụ: các cuộc gọi ở dạng này: methodName (..)}, tôi đã sử dụng:

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

Mặc dù, điều này cũng sẽ tìm thấy các nhà thầu.

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

Một ý tưởng hay là thêm một số mô tả về cách mã này giải quyết vấn đề đã cho. Vui lòng [sửa] câu trả lời của bạn để thêm mô tả như vậy. –

Các vấn đề liên quan