2

我从服务器获取以下字符串,仅以空格分隔。(换行符只是为了便于阅读,“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

方括号“[]”中的所有部分都可以包含或多或少的“[]”元素,并且内部“[]”中的单词的长度可以不同。我需要 HashMap 中的 a、b、c、d、e 等,但在我能做到之前,我需要以某种方式解析它。

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

我搜索并发现了很多网站和线程,人们建议除了“正则表达式解析”之外还有一些叫做“键值解析”的东西,但不幸的是,关于“键值解析”的信息很少。

编辑:最后,我想将这些值存储在 Hashmap 中,如下所示:

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

4 回答 4

2

你可以简单地这样做,它会打印你的 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);
    }
于 2012-11-24T16:52:03.883 回答
0

它不是Regex-Parsing,而是一些键值解析,但主要是通用解析。
你应该研究那个话题。

您的字符串中的问题是表达式 [] 可以包含其他表达式(嵌套 [[]])。
这不是三行就能解决的。
尝试搜索解释如何解析表达式。
此外,您需要了解什么是“语法”。然后在字符串中写下那个表达式的语法,
那么工作就完成了一半,因为你可以或多或少地严格按照语法来实现解析。

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

于 2012-11-24T16:46:01.433 回答
0

这有帮助吗

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);
于 2012-11-24T16:50:48.113 回答
0

与其使用正则表达式,不如使用经典的字符串标记器

这些天来,每个人都试图用正则表达式粉碎一切。这在 Perl 中很有意义,因为 regexp 在那里是一种非常简写的语法。但是对于 Java,正则表达式有点笨拙。

但是,Java 带来了许多有用的类,例如StringTokenizer。有些人认为它不鼓励,但在许多情况下它非常有用。

当然,还有各种帮助解析文件格式的包。

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

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

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

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

于 2012-11-24T16:52:58.010 回答