我正在接受正在划分的字符串
20004=1~^20005=0~^773=~^665=~^453=3~^448=0A~!447=D~!452=1~!~^448=0A~!447=D~!452=17~!~^448=81~!447=D~!452=7~!~^11=1116744Pq2Q~^70=15040024-1~^793=MNL-?--1~^467=37878024-1~^60=20110617-05:57:31~^75=20110616~^768=1~^769=20110616-19:17:00~!770=1~!~^55=7800950~^48=AEP~^22=~^454=0~^460=5~^167=TCKR~^
字符串的构成是〜^划分属性和〜!标记组。组在它们之前有一个属性,它告诉重复组的数量,如
453=3~^448=0A~!447=D~!452=1~!~^448=0A~!447=D~!452=17~!~^448=81~!447=D~!452=7~!~^
标签453表示有3组。
我正在使用这样的解析:
public Map<Integer, Object> parse(Object target)
{
String[] elements = ((String) target).split(elementDilimiter);
Map<Integer, Object> targetFields = new LinkedHashMap<Integer, Object>();
for(int i=0; i<elements.length; i++)
{
String[] attributes = elements[i].split(attributeDelimiter);
if(attributes.length != 2 || attributes[0].length() == 0 || attributes[1].length() == 0)
{
/*throw new ParsingException("Malformed element: " + element + ", expected: tag=value");*/
continue;
}
targetFields.put(Integer.valueOf(attributes[0]), attributes[1]);
}
return targetFields;
}
元素定界符=〜^和属性定界符=“=”
所以在行之后:
String[] elements = ((String) target).split(elementDilimiter);
值分为以下
453=3, 448=0A~!447=D~!452=1~!, 448=0A~!447=D~!452=17~!, 448=81~!447=D~!452=7~!,
然后将它们拆分为等于并使用tagNo放置在地图中以返回一个重要对象。
但是当小组到达时:
String[] attributes = element.split(attributeDelimiter);
由于以下原因,团体不再进一步:
attributes.length != 2
但理想情况下,我希望我的实现能够抓取标签453,意识到有3个重复组,重复组进入解析器,将分割它们分隔〜!并放置在子地图内。
现在,当我想到实施时,我会诚实地开始旋转。
是否有一个简单的资格解决方案,或者从头开始是基本的。
修改
453是否定义为始终是组数的标识符? 是的,组之前的标签只是告诉我将会有多少组。我无法控制传入的字符串或它的格式,它将采用上述形式。
你的小组代表什么 - 我问这个是因为我会认为属性是作为小组的一部分在一起,但是在你的方法中,你拆分属性而不是组,你在属性之前拆分元素? 我分割元素,以便它们可以分开为453 = 3等,然后这个组业务进来。所以现在我必须重写以适应它们。这本质上是我手头的问题,我有可爱的标签值映射到一个对象,可以通过以下方式访问:
targetFields.get(TagNumber);
现在我需要重写以启用组的可访问性!
我希望这有点清楚
答案 0 :(得分:0)
分两步使用String.split。 首先拆分组。之后拆分每个组的属性。
它将解决您的问题。
答案 1 :(得分:0)
此代码将解析组/子组。您可以将map.print语句替换为地图构建。但是,您可能想重新考虑这种格式,因为如果使用自然支持嵌套的格式(例如XML),它可能会更加清晰
@Test
public void testname() throws Exception {
parseText("453=3~^448=0A~!447=D~!452=1~!~^448=0A~!447=D~!452=17~!~^448=81~!447=D~!452=7~!~^");
}
private int subgroupLength = 0;
public void parseText(String text) {
for (String group : text.split("~\\^")) {
System.out.println("Group");
parseGroup(group);
}
}
public void parseGroup(String group) {
for (String attribute : group.split("~!"))
parseAttribute(attribute);
}
public void parseAttribute(String attribute) {
String[] split = attribute.split("=");
if (split.length != 2)
return;
if (split[0].equals("453")) {
System.out.println("\tSubgroup length " + split[1]);
subgroupLength = Integer.parseInt(split[1]);
} else if (subgroupLength > 0) {
subgroupLength--;
System.out.println("\t\t" + split[0] + " = " + split[1]);
} else
System.out.println("\t" + split[0] + " = " + split[1]);
}