从字符串中解析重复组

时间:2011-07-05 15:55:18

标签: java string parsing nested

我正在接受正在划分的字符串

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);

现在我需要重写以启用组的可访问性!

我希望这有点清楚

2 个答案:

答案 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]);
}