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
Trả lời
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;
}
Đố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.
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));
}
}
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. –
- 1. Các cuộc gọi phương thức trong EL
- 2. Tôi làm cách nào để tìm các cuộc gọi phương thức?
- 3. Eclipse trực quan cho chuỗi các cuộc gọi phương thức
- 4. Tìm phương thức gọi trong Java
- 5. Gọi phương thức ghi đè, siêu lớp cuộc gọi đã ghi đè phương thức
- 6. Cuộc gọi phương thức đo điểm chuẩn trong C#
- 7. Phương thức cơ sở cuộc gọi ở đầu hoặc cuối phương thức?
- 8. Thử lại các cuộc gọi Phương thức theo cách thức chung chung
- 9. Làm thế nào để đánh chặn các cuộc gọi phương thức cá thể?
- 10. Kiểm tra cuộc gọi phương thức không đồng bộ
- 11. Eclipse có thể được sử dụng để tìm tất cả các cuộc gọi phương thức không được chấp nhận?
- 12. Phương thức cơ sở cuộc gọi thay vì ghi đè
- 13. đặt dấu ngã trước cuộc gọi phương thức?
- 14. kết thúc cuộc gọi() từ phương thức tĩnh
- 15. Sử dụng các thuộc tính để gọi các phương thức
- 16. Cuộc gọi phương thức ghi đè trong Ruby?
- 17. Python: Cách chặn cuộc gọi phương thức không tồn tại?
- 18. Làm thế nào để chặn các cuộc gọi phương thức dll?
- 19. C#: Cách thanh lịch để thực hiện các cuộc gọi phương thức
- 20. Có một công cụ để trực quan hóa các cuộc gọi phương thức trong Python không?
- 21. Ruby có cung cấp một phương thức để hiển thị các cuộc gọi phân cấp không?
- 22. Tôi làm cách nào để kết nối các cuộc gọi phương thức của mình?
- 23. jprofiler hoặc khác: làm thế nào để cuộn lên các cuộc gọi phương thức đệ quy?
- 24. boost :: regex vs std :: regex - không thể tìm thấy phương thức empty()?
- 25. Các cuộc gọi đến các phương thức Javascript có an toàn hoặc đồng bộ hóa không?
- 26. Phím tắt AspectJ để gọi phương thức theo các phương thức cụ thể
- 27. Mã đằng sau các phương thức so với các cuộc gọi Jquery AJAX
- 28. Không thể sử dụng các phương thức "lớp" cho các cuộc gọi lại trong JavaScript
- 29. Được thông báo về các cuộc gọi phương thức trong .NET
- 30. Trong .NET, các cuộc gọi phương thức trống sẽ được tối ưu hóa?
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
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. –
Đồ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