2012-02-22 41 views
6

私は与えられたコードでメソッド呼び出しを探したい。だから私は区切り記号としてセミコロンでコードを分割しています。ですから、私は与えられたコードで呼び出されたメソッドの名前を見つけることに興味があります。メソッドの呼び出しパターンと一致する正規表現が必要です。助けてください!!正規表現のメソッド呼び出しを見つける

+0

正しい解決策が必要な場合、答えは実際には不可能です。 – biziclop

+2

実用的であるだけでなく、理論的でさえある。 Java(言語)は通常の言語ではないため、正規表現では解析できません。同意した; –

+1

;これは信じられないほど乱雑です。あなたはインスタンス化された関数呼び出しと関数呼び出しを一致させる必要がありますが、関数定義は一致させる必要があります。また、関数呼び出しでネストされた関数呼び出しではどうしますか? 'map.get(map.get(123))'?ああ。 – beerbajay

答えて

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

このコードが与えられた問題をどのように解決するかについての何らかの記述を追加することは、一般的には良い考えです。そのような説明を追加するには、あなたの答えを[編集]してください。 –

関連する問題