Java 有没有办法偷看()或使用匹配器返回

Java 有没有办法偷看()或使用匹配器返回,java,regex,matcher,Java,Regex,Matcher,我试图解析一个包含区域名称和组成该区域的坐标列表的文本文档。文本的结构不容易解析,因为它是这样自由书写的: GUZ06卡布尔图雷河 以一条线为边界的区域,该线从 内地海岸公园边界与 南纬27°08.981'的平行线(在 27°08.981'南,153°01.822'东),然后逐步运行- (a) 通常为西北风和东南风(通过卡布尔图) 沿内地海岸公园边界至 与东经153°02.197'子午线相交(在或 约27°08.762'南面,153°02.197'东面);和 … GUZ07-[…] 我希望能够做

我试图解析一个包含区域名称和组成该区域的坐标列表的文本文档。文本的结构不容易解析,因为它是这样自由书写的:

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()
不是真的。是否有任何方法可以使用
Matcher
API来近似此行为?理想情况下,我想要类似于
Stack.peek()
的东西,它返回下一个元素而不实际修改数据结构的内部状态。

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

尝试在组上迭代并按编号获取组。

我认为您可以编写如下模式:

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}-(.*)

现在,使用第二种模式遍历子文本并捕获所有坐标