1

完全修飾されたクラス名からクラス名以外のすべてをクリーンアップしようとしています。だから、私は.....のようなものを持っているかもしれません

"class gqlMain.Node"

...そして私は最終的に...になりたいです。

"Node"

...私のパターンはかなり確信しています...

"*.[\\.][^\\.]*"

..正しいです。上記のように実行してテストする場合は...

myMatcherObject.matches()

...常にtrueを返しますが、グループ化を追加しようとすると...

"(.*[\\.])([^\\.]*)"

...一致が見つからないというエラーが常に発生します。何が起こっているのかわからない。

追加した:

迅速な対応に感謝します。ええ、私は本当にこれを取得しません。私の正確なコードは...

public String toString() {
    Pattern packagePatt = Pattern.compile("(.*[\\.])([^\\.]*)");
    // 
    System.out.println(this.compClass.getName().toString());

    Matcher packageMatch = packagePatt.matcher(this.compClass.getName().toString());

    //
    System.out.println(packageMatch.group(2));
    return packageMatch.group(2);
}

たとえば、最初のprintステートメントは「gqlMain.Node」のような文字列を生成します(toString()が冗長であることはわかっているので、苛立ちから追加しました)。2番目のprintステートメントは、returnステートメントと同様にエラーを生成します。デバッガーを使用すると、Matcherオブジェクトのグループリストがすべてのインデックスで空のままであることがわかります。しかし、私が挿入した場合...

if (packageMatcher.matches()) {
    // print true
}

...私は常に'true'を取得します。これは本当に意味がありません。

4

2 に答える 2

1

次のプログラムは「true」を報告しました。

import java.util.regex.Matcher;
import java.util.regex.Pattern;




public class so {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Pattern p = Pattern.compile("(.*[\\.])([^\\.]*)");
        Matcher m = p.matcher("class gqlMain.Node");
        System.out.println(m.matches());
        System.out.println(m.group(0));
        System.out.println(m.group(1));
        System.out.println(m.group(2));

    }

}

完全な出力は次のとおりです。

true
class gqlMain.Node
class gqlMain.
Node
于 2012-07-19T05:23:37.263 に答える
0

この方法で識別子をスキャンすることはお勧めしません(ただし、過度に設計したくないと思います)。おそらく、識別子を一般的にスキャンするためのより厳密な次のソリューションが必要になるでしょう(ただし、率直に言って、私も最も正しい方法で識別子をスキャンしているとは思いません)。さらに、単一の文字列内で完全に/部分的に修飾された複数の識別子をスキャンできますが、修飾されていない識別子は完全に無視されます(たとえばclass、あいまいです)。

package stackoverflow;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import static java.lang.System.out;
import static java.util.regex.Pattern.CASE_INSENSITIVE;
import static java.util.regex.Pattern.compile;

public final class Q11554180 {

    private Q11554180() {
    }

    //
    // (3) The same as item (1) however we're       ------------------------------------------------+
    //     capturing the group to get the class                                                     |
    //     name only                                                                                |
    // (2) At least one package name is required    ---------------------------------+              |
    // (1) We're searching valid package names only -----------------+               |              |
    //     and we do not need to capture it ?:                       |               |              |
    //                                              +----------------+--------------+|+-------------+-------------+
    //                                              |                               |||                           |
    private static final Pattern pattern = compile("(?:[\\p{Alpha}_][\\p{Alnum}_]*\\.)+([\\p{Alpha}_][\\p{Alnum}_]*)", CASE_INSENSITIVE);

    private static void find(CharSequence s) {
        final Matcher matcher = pattern.matcher(s);
        while ( matcher.find() ) {
            out.println(matcher.group(1));
        }
    }

    public static void main(String[] args) {
        find("class gqlMain.Node; class gqlMain.p1.NodeA");
        find("class gqlMain.p1.p11.NodeB");
        find("class gqlMain.p1.p11.p111.NodeC");
        find(Q11554180.class.getCanonicalName());
    }

}

上記のコードは、次の出力を生成します。

Node
NodeA
NodeB
NodeC
Q11554180
于 2012-07-21T22:24:53.550 に答える