有没有办法窥视()或使用匹配器返回

时间:2011-07-25 10:15:07

标签: java regex matcher

我正在尝试解析包含区域名称和组成该区域的坐标列表的文本文档。文本的结构不是一种易于解析的方式,因为它是自由形式的,如下所示:

  

GUZ06-Caboolture River
  该区域由一条线开始   大陆与海洋公园边界的交汇点   北纬27°08.981'平行线(位于或大约为   27°08.981'南部,东经153°01.822'然后逐步运行 -   (a)一般在西北偏东和东南偏南(通过卡布尔彻   河)沿大陆的海洋公园边界到它   经度为东经153°02.197'的子午线(at或   大约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()不是真的。有没有办法使用Matcher API来估算这种行为?理想情况下,我希望像Stack.peek()这样的东西返回下一个元素而不实际修改数据结构的内部状态。

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

尝试迭代群组并按号码获取群组。

答案 2 :(得分: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} - (*)$。);

现在翻看子文章并使用第二个模式捕获所有坐标。