-1

こんにちは、解決できない問題があります。A は jar マニフェストから String の形式でパッケージをエクスポートしました。キーがパッケージの名前で、残りの情報がvalueの Map に入れたいと思います。それは簡単なことだと言うでしょうが、私が何をしたいのかを正確に示しましょう。私は文字列を持っています。

 aQute.bnd.annotation;version="1.43.1",aQute.bnd.annotati
 on.component;version="1.43.1",aQute.bnd.annotation.metatype;version="1.
 43.1",aQute.bnd.ant;uses:="aQute.service.reporter,org.apache.tools.ant,
 org.apache.tools.ant.taskdefs,org.apache.tools.ant.types";version="0.0.
 0",aQute.bnd.build;version="2.1.0";uses:="aQute.bnd.maven.support,aQute
 .bnd.osgi,aQute.bnd.service,aQute.bnd.service.action,aQute.bnd.version,
 aQute.service.reporter",aQute.bnd.build.model;version="2.3";uses:="aQut
 e.bnd.build.model.clauses,aQute.bnd.properties,aQute.bnd.version,org.os
 gi.resource",aQute.bnd.build.model.clauses;version=2;uses:="aQute.bnd.h
 eader",aQute.bnd.build.model.conversions;uses:="aQute.bnd.build.model,a
 Qute.bnd.build.model.clauses,aQute.bnd.header,aQute.libg.tuple,org.osgi
 .resource";version="0.0.0"

キーのコンマ(、)で分割すると、ピースが間違ってしまいます。

aQute.bnd.ant;uses:="aQute.service.reporter,org.apache.tools.ant,
 org.apache.tools.ant.taskdefs,org.apache.tools.ant.types";version="0.0.
 0"

uses句では、依存パックの名前もカンマで区切ります。したがって、上記の行は次のように出力マップに含まれている必要があります。

Key: aQute.bnd.ant
Value: uses:="aQute.service.reporter,org.apache.tools.ant,
 org.apache.tools.ant.taskdefs,org.apache.tools.ant.types";version="0.0.
 0"

それでは、私の仕事をするためにどの文字列メソッドまたは正規表現を使用すればよいでしょうか?

4

2 に答える 2

1

長い道のりが最も簡単な方法である場合もあります。

public static Map<String, String> parse(String s) {
    Map<String, String> allPackageInfo = new HashMap<>();

    CharacterIterator i = new StringCharacterIterator(s);
    char c = i.first();
    while (c != CharacterIterator.DONE) {
        StringBuilder packageName = new StringBuilder();
        while (c != ';' && c != CharacterIterator.DONE) {
            packageName.append(c);
            c = i.next();
        }

        if (c == ';') {
            c = i.next();
        }

        StringBuilder packageInfo = new StringBuilder();
        while (c != ',' && c != CharacterIterator.DONE) {
            if (c == '"') {
                do {
                    packageInfo.append(c);
                    c = i.next();
                } while (c != '"');
            }
            packageInfo.append(c);
            c = i.next();
        }

        if (c == ',') {
            c = i.next();
        }

        allPackageInfo.put(packageName.toString(), packageInfo.toString());
    }

    return allPackageInfo;
}
于 2013-10-26T13:31:27.050 に答える