我有一个来自另一个进程的字符串,格式为:
{{"data1""data2"}{"column1""column2""column3"}}
双引号中的括号之间可以有任意数量的列或数据。我需要将每个数据点放入一个列表中,将每一列放入另一个列表中。
我正在使用 java 解析它......由于数据和列的数量未知,正则表达式遇到了一些问题。是否有图书馆或其他我可以使用的东西?
希望这是有道理的,谢谢!
我有一个来自另一个进程的字符串,格式为:
{{"data1""data2"}{"column1""column2""column3"}}
双引号中的括号之间可以有任意数量的列或数据。我需要将每个数据点放入一个列表中,将每一列放入另一个列表中。
我正在使用 java 解析它......由于数据和列的数量未知,正则表达式遇到了一些问题。是否有图书馆或其他我可以使用的东西?
希望这是有道理的,谢谢!
不确定 Regex 是否是最佳解决方案。我会使用String.split。
int midIndex = myString.indexOf("}{");
String[] datas = myString.substring(2, midIndex).split("\"");
String[] columns = myString.substring(midIndex+2, myString.length()-2).split("\"");
以上将在数组中包含一些空字符串,但排除空字符串是微不足道的。
如果你使用 Guava 的Splitter,你可以这样做:
Splitter mySplitter = Splitter.on("\")
.trimResults()
.omitEmptyStrings();
Iterable<String> datas = mySplitter.split(myString.substring(2, midIndex));
Iterable<String> columns = mySplitter.split(myString.substring(
midIndex+2, myString.length()-2));
ANTLR通常被推荐为解析器解决方案(类似于 Lex/Yacc,但在 Java 世界中),但如果数据格式很简单(例如,您的数据/列元素中没有大括号),我可能会使用正则表达式来提取内部数据实体,以及内部列实体(即大括号之间的数据)和进一步拆分,可能使用另一个正则表达式。
两个不同的正则表达式(或一个正则表达式和一个后续的字符串拆分操作)可能比一个包罗万象的正则表达式简单得多。