在java中解析字符串

在java中解析字符串,java,string,parsing,Java,String,Parsing,我从服务器获得以下字符串,仅用空格分隔。(换行符只是因为可读性,“XX是一个占位符,长度可以不同。方括号中的内容长度也可以不同 字符串1: status:ok [XXX][a=XXX b=XXX c=XXX d=XXX e=0 f=XXX g=XXX h=XXX i=XXX j=XXX k=XXX l=XXX m=XXX n=[[XXX][XXX]] p=[[XXX][XXX][XXX][XXX][XXX][XXX][XXX]]] end:end 字符串2: status:ok [XXX][

我从服务器获得以下字符串,仅用空格分隔。(换行符只是因为可读性,“
XX
是一个占位符,长度可以不同。方括号中的内容长度也可以不同

字符串1:

status:ok [XXX][a=XXX b=XXX c=XXX d=XXX e=0 f=XXX g=XXX h=XXX i=XXX j=XXX 
k=XXX l=XXX m=XXX n=[[XXX][XXX]] p=[[XXX][XXX][XXX][XXX][XXX][XXX][XXX]]]
end:end
字符串2:

status:ok [XXX][a=XXX b=XXX  c=XXX d=XXX d2=XXX e=XXX  f=XXX g=XXX h=XXX i=XXX j=XXX 
k=XXX l=XXX m=XXX n=[[XXX][XXX]] p=[[XXX][XXX][XXX][XXX][XXX][XXX][XXX]]]
end:end
方括号“[]”中的所有部分都可以包含更多或更少的“[]”-内部“[]”中的元素和单词的长度可以不同。我需要哈希映射中的这些a、b、c、d、e等,但在此之前,我需要以某种方式对其进行解析

如何在Java中有效地解析此字符串?

我搜索并发现了很多网站和帖子,其中人们除了“正则表达式解析”之外,还提出了一种称为“键值解析”的方法,但不幸的是,“键值解析”的信息很少

编辑: 最后,我希望将这些值存储在哈希映射中,如下所示:

HashMap<String,Object> myHashMap = new HashMap();
myHashMap.put(a, XXX);
....
myHashMap.put(p,array-of-all-[XXX]);
HashMap myHashMap=newhashmap();
myHashMap.put(a,XXX);
....
put(p,all-[XXX]的数组);

它不是正则表达式解析,而是一点键值解析,但主要是一般解析。
你应该研究那个话题。 字符串中的问题是表达式[]可以包含其他表达式(嵌套的[])。
这不是三行可以解决的问题。
尝试搜索如何解析表达式的说明。
此外,你还需要理解什么是“语法”。 然后在字符串中写下该表达式的语法,
然后完成一半的工作,因为您可以或多或少严格地按照语法实现解析

另一种解决方案:使用上面不适用于n和p(数组)的答案之一。在第二步中,您解析表达式[[XXX][XXX][XXX][XXX][XXX][XXX][XXX][XXX]],这并不困难;(您可以使用
String.split(“]”
并返回字符串,直到找到“[”。
这会有帮助吗

String str = "status:ok [XXX][a=XXX b=XXX c=XXX d=XXX e=0 f=XXX g=XXX h=XXX i=XXX j=XXX k=XXX l=XXX m=XXX n=[[XXX][XXX]] p=[[XXX][XXX][XXX][XXX][XXX][XXX][XXX]]] end:end";
String[] splitStrA = str.split(" ");         
HashMap<String,String> map = new HashMap() ;
for (String splitStr : splitStrA) {
    String[] splitStr1 = splitStr.split("=");
    if (splitStr1.length == 2) {
        map.put(splitStr1[0], splitStr1[1]);
    }
}
System.out.println(map);
String str=“状态:ok[XXX][a=XXX b=XXX c=XXX d=XXX e=0F=XXX g=XXX h=XXX i=XXX j=XXX k=XXX l=XXX m=XXX n=[[XXX][XXX]]p=[[XXX][XXX][XXX][XXX][XXX][XXX]]结束:结束”;
字符串[]splitStrA=str.split(“”);
HashMap=newHashMap();
用于(字符串splitStr:splitStrA){
字符串[]splitStr1=splitStr.split(“”);
if(splitStr1.length==2){
map.put(splitStr1[0],splitStr1[1]);
}
}
系统输出打印项次(map);

您只需执行此操作,它就会打印您的a、b、c

  String s ="status:ok [XXX][a=XXX b=XXX c=XXX d=XXX e=0 f=XXX g=XXX h=XXX i=XXX j=XXX k=XXX l=XXX m=XXX n=[[XXX][XXX]] p=[[XXX][XXX][XXX][XXX][XXX][XXX][XXX]]] end:end".replaceAll("end:end", "");

    String [] ss  = s.split("=");
    HashMap<Character,Object> myHashMap = new HashMap();
    try{
    for(int i=0;i<ss.length;i++){

        myHashMap.put(ss[i].charAt(ss[i].length()-1), ss[i+1].substring(0, ss[i+1].length()-1).trim());

    }

    }catch(Exception e){
        // do nothing
    }
      System.out.println(myHashMap);
    }
String s=“status:ok[XXX][a=XXX b=XXX c=XXX d=XXX e=0 f=XXX g=XXX h=XXX i=XXX j=XXX k=XXX l=XXX m=XXX n=[[XXX][XXX][XXX][XXX][XXX]]p=[XXX][XXX][XXX][XXX][XXX][XXX][XXX]]end:end.replaceAll”(“end:end”;“end:end”;“end:end;
字符串[]ss=s.split(“”);
HashMap myHashMap=新HashMap();
试一试{

对于(inti=0;i而不是使用正则表达式,使用经典的字符串标记器如何

现在,每个人都试图用regexp打破一切。这在Perl中很有意义,因为regexp是一种非常简捷的语法。但是对于Java来说,regexp有点笨拙

但是,java带来了许多有用的类,例如,有些人认为它是令人沮丧的,但在很多情况下它是非常有用的。 当然,还有各种各样的软件包可以帮助解析文件格式

例如,Weka机器学习工具包使用的解析器生成器

可能是受到经典C“flex”解析器生成器(以及Yacc、Bison等)的启发

一个好的解析器将能够解析嵌套的表达式。它将知道如何解释表达式,例如
A=[[1,2],[3,4]]
,即使它们嵌套得很深。正则表达式无法做到这一点


正则表达式没有什么错。但是它们是为匹配而设计的,而不是为解析而设计的。

我需要以某种方式解析它。
->
以某种方式这到底是什么?
“方括号中的所有部分”[]”可以包含更多或更少的“[]”元素“你的意思是方括号内的任何内容都是可选的吗?你是否也需要n和p,或者你的示例中只有a-m(m和p是嵌套的)对n和p不起作用,他想要的是数组而不是字符串对n和p不起作用,他想要的是XXX数组而不是字符串