Есть ли способ посмотреть () или вернуться с помощью Matcher - PullRequest
2 голосов
/ 25 июля 2011

Я пытаюсь проанализировать текстовый документ, содержащий названия регионов и список координат, которые составляют регион.Текст не структурирован так, чтобы его можно было легко разобрать, так как он написан в свободной форме, например:

GUZ06 - река CabooltureРайон, ограниченный линией, начинающейся на пересечении границы морского парка на материке и параллели с широтой 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(), которое возвращает следующий элемент без фактического изменения внутреннего состояния структуры данных.

Ответы [ 3 ]

2 голосов
/ 25 июля 2011

Вы можете использовать Matcher.find(int) для сброса устройства сравнения и начала поиска с запомненной точки.

1 голос
/ 25 июля 2011

Я думаю, что вы можете написать шаблон следующим образом:

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

Теперь перейдите по подтекстам и перехватите все координаты, используя второй шаблон.

1 голос
/ 25 июля 2011

Попробуйте перебирать группы и получать группы по номерам.

...