用于提取键值对的正则表达式

时间:2014-01-08 11:27:08

标签: java regex

我有一个文本文件。该特定文本文件的示例内容类似于

root(ROOT-0, good-4)nn(management-2, company-1)nsubj(good-4, management-2)

现在我需要将其分开并将其存储在ArrayList中。为此,我写下面的代码

public class subject {
public void getsub(String f){
    ArrayList <String>ar=new ArrayList<String>();
    String a="[a-z]([a-z]-[0-9],[a-z]-[0-9])";
    Pattern pattern=Pattern.compile(a);
    Matcher matcher=pattern.matcher(f);
    while(matcher.find()){
        if(matcher.find()){
            ar.add(matcher.group(0));
        }
    }
    System.out.println(ar.size());
    for(int i=0;i<ar.size();i++){
        System.out.println(ar.get(i));
    }



}

}

但是arraylist没有填充。为什么会如此

1 个答案:

答案 0 :(得分:3)

您在Pattern中使用了未引用的括号。

未加引号的括号表示Pattern中的组的定义,以供以后的反向引用。

但是,您在这里尝试匹配实际的括号,因此需要对它们进行转义:\\(\\)

对于粗略的解决方案,请尝试以下方法:

String text = "root(ROOT-0, good-4)nn(management-2, company-1)nsubj(good-4, management-2)";
List<String> myPairs = new ArrayList<String>();
Pattern p = Pattern.compile(".+?\\(.+?,.+?\\)");
Matcher m = p.matcher(text);
while (m.find()) {
    myPairs.add(m.group());
}
System.out.println(myPairs);

输出:

[root(ROOT-0, good-4), nn(management-2, company-1), nsubj(good-4, management-2)]

最后注意事项:对于改进的解决方案,我会尝试使用组来区分Pattern的第一部分和括号中的实际对,以便构建Map<String, ArrayList<String>>作为数据在这种情况下的对象 - 但这超出了这个答案的范围。