0

Javaソースファイルから単語フレーズを抽出しようとしています。たとえば、私は単純なソースクラスを持っています

class TestClass implements TestInterface implements TestInterface2 {

}

class TestClass2 {

}

「classTestClass」と「classTestClass2」を抽出したい。さまざまな正規表現パターンを試しましたが、解決策が見つかりませんでした

私のテストコードスピネット:-

public static void wordPhraser(String sourceText) {

    Pattern p = Pattern.compile("class(\\s+)([a-zA-Z]*)");
    Matcher m = p.matcher(sourceText);
    while (m.find()) {
        System.out.println("output " + m.group());
    }
}

また試した:-

"class\\s*([a-zA-Z])"
"class\\s*[a-zA-Z]"
"^class\\s+[a-zA-Z]$"

これらのどれも機能していません。

ありがとう。

4

2 に答える 2

2

これが私が使用する正規表現です:

(final|abstract|\n|^) {0,}class {1,}.{1,} {0,}\\{

しかし、それは実装/インターフェースも含むテストを取得します。これらを解析し、クラス名を取得するために使用するコードは次のとおりです。

        String match = m.group();//m is my matcher for the regex
        String s = match.substring(match.indexOf("class ") + "class ".length(), match.lastIndexOf("{")).trim();
        if(s.contains("extends"))
            s=s.substring(0, s.indexOf("extends"));
        if(s.contains("implements"))
            s=s.substring(0, s.indexOf("implements"));
        s=s.trim();
        strings.add(s);

注:これはパブリッククラスまたはプライベートクラスでは機能せず、単にfinal/abstract修飾子を持つクラスでのみ機能します

于 2012-07-24T19:02:41.307 に答える
2

私はそれらが機能すると言うことを恐れていますが、改善の余地があります:

\bclass(\s+)([a-zA-Z_]\w*)\b

より良い正規表現です。あなたは数字を一致させていませんでした。

確かに、これはJavaでの使用方法です。

String regex = "\\bclass(\\s+)([a-zA-Z_]\\w*)\\b";

もっと一致させるには:

\b((public|private|protected|static|abstract|final)\s*)*class(\s+)([a-zA-Z_]\w*)\b

デモ:

ここに画像の説明を入力してください

于 2012-07-24T19:02:42.163 に答える