我正在尝试解析包含区域名称和组成该区域的坐标列表的文本文档。文本的结构不是一种易于解析的方式,因为它是自由形式的,如下所示:
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()
这样的东西返回下一个元素而不实际修改数据结构的内部状态。
答案 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} - (*)$。);
现在翻看子文章并使用第二个模式捕获所有坐标。