2016-05-19 3 views
0

Я использую Java и парсинг строки данных, имеющих переменную длину данных, как показано ниже,Регулярное выражение для разбора конкретного набора данных

kv { 
    key "prefix" 
    str_value "prefix1" 
} 
kv { 
    key "init"   
    int_value 1   
} 
kv { 
    key "init"   
    } 

Как мы можем видеть, что последний Kv тег имеет одно поле значение недостающего но все же действительны. Подумайте, какое регулярное выражение я должен использовать для извлечения любых данных между тегами kv {}, как показано ниже.

ключ "префикс" str_value "prefix1"

ключ "INIT" int_value 1

ключ "INIT"

Вот код, я использую, чтобы получить Kv разделители.

scan = new Scanner(new File(this.getFileName())).useDelimiter(".*kv\\s*\\{\\s*[^}].*+"); 
System.out.println(scan.next()); 
+1

Возможно, вы не должны использовать регулярные выражения, чтобы попытаться проанализировать несколько строк, особенно с этим регулярным выражением в качестве «разделителя». Regex является мощным, но не всегда правильным инструментом для работы. Вероятно, вам нужен простой анализатор на основе токенов. –

+0

@JimGarrison Для парсера, основанного на токенах, следует ли читать строки за строкой и проверять каждую строку «startswith» или любой другой эффективный способ делать? – Ammad

ответ

2

Что-то вроде этого рисунка следует сделать трюк:

kv\s*\{\s*key\s+"([^"]*)"\s*(str_value\s+"([^"]*)"|int_value\s+(\d+))?\s*\} 

Demo

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

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

kv\s*\{([^}]*)} 

Тогда просто прочитать значение первой группы от каждого матча.

+0

Привет, Стив, я беспокоюсь о любой вещи внутри тега kv {}. Так что конкретно не связано с str_value или int_value – Ammad

+0

Если вы хотите захватить все между фигурными скобками, то просто добавьте группу захвата вокруг этой цели и прочитайте ее значение. –

+0

Это решение довольно близко к тому, что я ищу. kv \ s * \ {([^}] *)}, но если я помещаю его в разделитель, он дает мне все, кроме того, что мне нужно. Это означает, что он рассматривает kv {} как разделитель и пропускает все, включая совпадение kv \ s * \ {([^}] *)}. Как я могу сделать обратное? – Ammad

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