3

我正在尝试解析包含区域名称和组成该区域的坐标列表的文本文档。文本不是以易于解析的方式构造的,因为它是这样自由编写的:

GUZ06—卡布尔彻河
以大陆海洋公园边界与南纬 27°08.981' 平行线(南纬 27°08.981'、东经 153°01.822' 点或附近)交界处为界的区域) 然后逐渐— (a) 沿着大陆上的海洋公园边界向西北和东南方向(通过卡布尔彻河)向其与东经 153°02.197' 子午线的交点(在或大约27°08.762' 南,153°02.197' 东);和
...
GUZ07-[...]

我想做的是匹配一个区域的名称,然后找到下一个区域在哪里,提取两个匹配点之间的文本块,然后在那个块上运行我的坐标提取逻辑文本,使用类似:

while (matcher.find()) {
    int textStart = matcher.end() + 1;  //remember the end of the current title
    matcher.find();                     //find the start of the next title
    String regionData = myBigString.substring(textStart, matcher.start());  //extract the text for this region

    //[process the region data]

    matcher.forgetLastFind();  //need to go back so that the next iteration starts from the correct place
}

当然,forgetLastFind()不是真的。有没有办法使用MatcherAPI 来近似这种行为?理想情况下,我想要Stack.peek()返回下一个元素而不实际修改数据结构的内部状态的东西。

4

3 回答 3

2

您可以使用Matcher.find(int)重置匹配器并从记住的点开始搜索。

于 2011-07-25T10:25:45.310 回答
1

尝试迭代组并按数字获取组。

于 2011-07-25T10:27:14.143 回答
1

我认为你可以这样写模式:

Pattern.compile("GUZ\\d{2}-(.*)\r?\n.*?(\\dd{1,3}°(\\d{1,2}).(\\d{3})')", Pattern.MULTILINE | Pattern.DOTALL)

此模式将捕获区域名称和第一个坐标。

如果您希望捕获所有坐标,您只需将模式分成 2:首先匹配名称:Pattern.compile("^GUZ\\d{2}-(.*)$")

第二场比赛坐标: Pattern.compile("(\\dd{1,3}°(\\d{1,2}).(\\d{3})')")

现在您可以使用第一个模式拆分文本: text.split(^GUZ\d{2}-(.*)$);

现在检查潜文本并使用第二个模式捕获所有坐标。

于 2011-07-25T10:28:29.797 回答