私は与えられたコードでメソッド呼び出しを探したい。だから私は区切り記号としてセミコロンでコードを分割しています。ですから、私は与えられたコードで呼び出されたメソッドの名前を見つけることに興味があります。メソッドの呼び出しパターンと一致する正規表現が必要です。助けてください!!正規表現のメソッド呼び出しを見つける
6
A
答えて
0
文字列に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;
}
1
{すなわち、この形式で呼び出します:[objectNameに|クラス名] .methodName(..)}、私が使用してきた:
(\.[\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
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
このコードが与えられた問題をどのように解決するかについての何らかの記述を追加することは、一般的には良い考えです。そのような説明を追加するには、あなたの答えを[編集]してください。 –
関連する問題
- 1. &&を見つける正規表現&&
- 2. Windowsのタスクリスト-v出力の正規表現を見つける
- 3. 正規表現を見つけるための正規表現ですか?
- 4. xcodeで正規表現を見つけて置き換える正規表現...?
- 5. コード内のすべてのメソッドを見つけるための正規表現
- 6. (C)関数呼び出しに一致する正規表現
- 7. メソッドの呼び出し元を見つける
- 8. 空のアンカータグを見つけるための正規表現
- 9. 正規表現のすべてのキャプチャグループを見つける
- 10. フレーズを見つけるためのJavaのユーザー正規表現
- 11. Hrefの値を見つけるための正規表現
- 12. Cスタイルのブロックコメントを見つけるための正規表現
- 13. すべての条件文を見つける正規表現
- 14. ICU正規表現を使用してカッコ内にない数字を見つける正規表現
- 15. 正規表現が負の正規表現(つまり、正規表現と一致しない文字列を見つける)
- 16. 正規表現を使ってPythonでデータを見つける
- 17. 見つける。正規表現の問題の文字
- 18. 正規表現:各一致を見つけて置換する
- 19. C#でコードブロックを見つける正規表現
- 20. 正規表現で特殊パターンを見つける方法
- 21. PHPは正規表現で文字列を見つける
- 22. 二重引用符を見つけるJava正規表現
- 23. 正規表現見つける特定のインスタンス
- 24. .htaccess正規表現の最後の一致を見つけるための正規表現
- 25. 正規表現が文字列を見つけられない
- 26. 正規表現は正しく一致を見つけても間違って
- 27. Python正規表現と複数回見つけた
- 28. 正規表現を使ってRubyで正確なパターンマッチングを見つける
- 29. マッチしない括弧を見つけるための正規表現
- 30. 単語の最初の出現の直後にテキストを見つけるための正規表現
正しい解決策が必要な場合、答えは実際には不可能です。 – biziclop
実用的であるだけでなく、理論的でさえある。 Java(言語)は通常の言語ではないため、正規表現では解析できません。同意した; –
;これは信じられないほど乱雑です。あなたはインスタンス化された関数呼び出しと関数呼び出しを一致させる必要がありますが、関数定義は一致させる必要があります。また、関数呼び出しでネストされた関数呼び出しではどうしますか? 'map.get(map.get(123))'?ああ。 – beerbajay