2014-01-27 2 views
0

Это мои данные и его картина:Regex шаг за шагом анализатор Java

// _23.02_ANTALYA____________FRANKFURT___________DE_7461_18:20-21:00________________ 
public static final String FLIGHT_DEFAULT_PATTERN = "\\s+\\d{2}.\\d{2}\\s[A-Z]+\\s+[A-Z]+\\s+[A-Z\\s]{3}[\\d\\s]{5}\\d{2}:\\d{2}-\\d{2}:\\d{2}\\s+"; 

подчёркивания символ пробела. Теперь мне нужен класс, который делит каждый термин регулярного выражения на данные. Например,

\\s+ = " " 
\\d{2} = "23" 
. = "." 
\\d{2} = "02" 
\\s = " " 
[A-Z]+ = "ANTALYA" 

etc ... Это необходимо заказать по образцу.

Как я могу это сделать или есть библиотека для этого?

+6

Прочтите документы. Вам нужно захватить группы. – devnull

+0

На самом деле я представляю себе алгоритм для этого, но если есть инструмент, который может быть хорошим. Я не хочу тратить свое время. – kodmanyagha

ответ

0

Я нашел другой способ. Я разделил кусочки рукой.

// _24.02_MAURITIUS_________HAMBURG________________via:FRA_DE/LH____08:30-20:05_____ 
public static final List<String> FLIGHT_VIA_PATTERN = Arrays.asList("\\s+", "\\d{2}", "\\.", "\\d{2}", "\\s+", "[A-Z]+", "\\s+", "[A-Z]+", "\\s+", "via:", "[A-Z\\s]{4}", "[A-Z]{2,3}", "/", 
     "[A-Z]{2,3}", "\\s+", "\\d{2}", ":", "\\d{2}", "\\-", "\\d{2}", ":", "\\d{2}", "\\s+"); 

После этого я использовал петлю, и все в порядке. Этот вопрос может закрыться.

2

Как @devnull упоминалось, вы должны использовать capturing groups:

(\s+)(\d{2})(.)(\d{2})(\s)([A-Z]+)(\s+)([A-Z]+)(\s+)([A-Z\s]{3})([\d\s]{5})(\d{2}:\d{2})(-)(\d{2}:\d{2})(\s+) 

Смотрите полное объяснение этого регулярного выражения на Regex101.

Вы бы затем использовать что-то вроде следующее соответствие текста и извлечь отдельные значения:

String text = " 23.02 ANTALYA   FRANKFURT   DE 7461 18:20-21:00     "; 
Pattern pattern = Pattern.compile("(\\s+)(\\d{2})(.)(\\d{2})(\\s)([A-Z]+)(\\s+)([A-Z]+)(\\s+)([A-Z\\s]{3})([\\d\\s]{5})(\\d{2}:\\d{2})(-)(\\d{2}:\\d{2})(\\s+)"); 
Matcher matcher = pattern.matcher(text); 
if (matcher.find()) { 
    for (int i = 1; i < matcher.groupCount(); i++) { 
     System.out.println(matcher.group(i)); 
    } 
} 

Чтобы сделать его проще для извлечения определенных полей, вы можете (в Java 7 и выше) используют под названием захвата группы:

(?<LeadSpace>\s+)(?<Day>\d{2})(.)(?<Month>\d{2})... 

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

... 
if (matcher.find()) { 
    System.out.println(matcher.group("LeadSpace")); 
    System.out.println(matcher.group("Day")); 
    System.out.println(matcher.group("Month")); 
    ... 
} 
+0

Thx для вашего ответа. Я решил свою проблему по-другому, но ваш ответ имеет более полезную информацию. И мы используем java6 в компании. – kodmanyagha

Смежные вопросы