токенизировать строку - PullRequest
       3

токенизировать строку

2 голосов
/ 12 января 2012

Я получил строку в следующем формате: yyyyMMdd_HHmm_ss_unitCode_ (status). Мне нужно сопоставить каждый компонент свойству выделенного класса.

Я думал об определении моего токена с помощью регулярного выражения: {d+}4{d+}2{d+}2_{d+}2_{d+}2_{s+}3_{s+}2 => Приносим извинения за приблизительный синтаксис регулярных выражений, d - десятичный, а s - строковый.

Как я могу сказать своему парсеру, что первая группа {d+}4 должна входить в свойство "year" моего класса, вторая - в "month" и т. Д.

Очевидно, я мог бы просто сделать это: token.setYear(substring(0,4)), но я хотел быть немного более общим, поскольку у меня нет контроля над структурой имени файла. Я также рассмотрел определение структуры XML с помощью startPosition, endPosition, имени атрибута для хранения и типа.

В общем, я думал, что все это слишком сложно. Проблема в том, что у меня нет ни одного разделителя, чтобы можно было использовать String.split.

1 Ответ

0 голосов
/ 12 января 2012
String input; // yyyyMMdd_HHmm_ss_unitCode_(status)
SpecialClass output;

String regex = "(\\d{4})(\\d{2})(\\d{2})_(\\d{2})(\\d{2})_(\\d{2})_([^_]+)_\\((.+)\\)";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(input);

if (m.matches())
{
    output.year = m.group(1);
    output.month = m.group(2);
    // etc
}

Пример ввода:

String input = "20120113_1234_27_500_(33)";

Будет производить следующие группы:

Group 1: 2012 //year
Group 2: 01   //month
Group 3: 13   //day
Group 4: 12   //hour
Group 5: 34   //minute
Group 6: 27   //second
Group 7: 500  //unitcode
Group 8: 33   //status

Программа испытаний: http://pastebin.com/upC5R9rP

...