3

地域名と地域を構成する座標のリストを含むテキスト ドキュメントを解析しようとしています。テキストは、次のように自由形式で書かれているため、簡単に解析できる方法で構造化されていません。

GUZ06 - カブルチャー川
本土の海洋公園境界線と南緯 27 度 08.981 分の緯度 (南緯 27 度 08.981 分、東経 153 度 01.822 分の地点またはその付近) の交点から始まる線によって囲まれた地域(a) 本土の海洋公園の境界に沿って、東経 153 度 02.197 分の子午線との交点まで (カブルチャー川を経由して) ほぼ北西および南東に走る。 27°08.762' 南、153°02.197' 東); そして
...
GUZ07-[...]

私ができるようにしたいのは、地域の名前と照合し、次の地域がどこにあるかを見つけ、2 つの一致点の間のテキスト ブロックを抽出し、そのブロックで座標抽出ロジックを実行することです。次のようなテキストを使用します。

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

2 番目に一致する座標: Pattern.compile("(\\dd{1,3}°(\\d{1,2}).(\\d{3})')")

これで、最初のパターンを使用してテキストを分割できます: text.split(^GUZ\d{2}-(.*)$);

サブテキストを調べて、2 番目のパターンを使用してすべての座標を取得します。

于 2011-07-25T10:28:29.797 に答える