2013-10-26 29 views
-1

嗨,我有一个问题,我无法解决。 A已经以String的形式从jar清单中导出了pacakges,我想将它放在Map中,其中key是包的名称,其余信息在的值中。你会说这是蛋糕的平安,但让我们告诉你我到底想做什么。我有一个字符串,我小片从它Java String to 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" 

其中使用条款我们也用逗号分隔依赖包的名称。所以,上面的线必须在我的输出映射为:

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" 

所以其字符串的方法或者正则表达式用来做我的工作?

+1

你能指定想要的样本输出吗 – Prateek

回答

1
//split at , only if it's not within "" 
String[] packages=input.split(",(?=([^\"]*\"[^\"]*\")+[^\"]*$)"); 
for(String pack:packages) 
{ 
    String[] output=pack.split("(?=uses:=)"); 
    output[0];//key 
    if(output.length==2)//incase if there's no value 
    output[1];//value 
} 

编辑

(?=uses:=)是一个超前这将匹配在其后面uses:= ..Now我们可以使用uses:=为正则表达式,但想吃uses:=位置...为了避免它,我们使用zero width lookahead

+0

oops ..有一些错别字纠正 – Anirudha

+0

没问题,但我不完全理解__?= __的意思。 – Xelian

+0

@Xelian查看编辑 – Anirudha

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; 
}