2013-02-05 4 views
0

Я пытаюсь преобразовать список с ключом TCL в Java HashMap и вам нужно использовать регулярные выражения, чтобы разбить фрагменты текста. Образец текста я использую это:Использование регулярных выражений для соответствия повторяющейся последовательности

 
{ID {{NAME X } {HUB 0 } {NUM 14226188 }}} {SRCID {{NAME XY } {HUB 0 } {NUM 14226136 }}} {TYPE DATA } 

Здесь существует три различных группы ID, SRCID и TYPE. Я попытался использовать regexp {.*?}, но первые две группы разбиваются. Если я использую только {.*}, тогда вся строка будет соответствовать единице, а не трем. Любые предложения о том, что я должен попробовать дальше?

+0

Я не думаю, что регулярное выражение - это способ пойти в вашем случае. Вам лучше сканировать каждый символ строки, и если это фигурная скобка, рассмотрите ее как новый объект (или часть объекта). –

+2

Вам, вероятно, нужно написать простой рекурсивный парсер спуска для этого: http://en.wikipedia.org/wiki/Recursive_descent_parser –

+0

@MikhailVladimirov no вам не нужно использовать парсер. Ввод ** согласован ** (* паратезис сбалансированы *). 'regex' прекрасно выполнит работу. – Anirudha

ответ

0

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

public class RegexTester { 
public static void main(String[] args) throws Exception { 
    String data = "{ID {{NAME X } {HUB 0 } {NUM 14226188 }}} {SRCID {{NAME XY } {HUB 0 } {NUM 14226136 }}} {TYPE DATA }"; 

    Pattern pattern = Pattern.compile("(\\{\\bID.+\\})\\s*(\\{SRCID.+\\})\\s*(\\{TYPE DATA.+\\})"); 
    Matcher matcher = pattern.matcher(data); 

    while (matcher.find()) { 

     System.out.println(matcher.group(1)); // Group - ID 
     System.out.println(matcher.group(2)); // Group - SRCID 
     System.out.println(matcher.group(3)); // Group - TYPE DATA 
    } 
} 

Выход:

{ID {{NAME X} {HUB 0} {NUM 14226188}}}
{SRCID { {NAME XY} {HUB 0} {NUM 14226136}}}
{TYPE DATA}

Надеюсь, это поможет.

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