2014-02-07 3 views
0
  id no, no2, list 
      id1 (3, 5, [t[0][66], y[5][626]]) 
      id2 (3, 5, [t[0][66], y[5][626], z[5][626]]) 
      id2 (3, 5, [t[0][66], y[5][626]]) 
      id3 (32, 54, [t[0][66], y[5][626]]) 
      id4 (3, 541, [t[0][66], y[5][626], u[5][626], y[25][6226]]) 
      id5 (3, 52, [t[0][66], y[5][626]]) 
      id6 (23, 5, [t[0][66], y[5][626]]) 

Как я могу разобрать такой текст? Я попытался создать объект из него без особого успеха. Список может отличаться по размеру. Java-код был бы замечательным, но любой язык, псевдо-код или обычный язык в порядке.Как разбирать такой текст?

+2

семантически, что такое смысл каждое поле? –

+0

'id no, no2, list' - это заголовок, а другие строки - просто строки. Имеет ли это смысл? –

+0

было бы полезно увидеть некоторый прототип класса, который вы ожидаете. Например, вы хотели бы, чтобы это было: class ParsedObject {String id; int no; int no2; Список лист; }? или какой-либо другой формат? – zimi

ответ

0

Я попытался сделать регулярное выражение для извлечения данных, но у меня нет времени его завершить.

вот что я до сих пор: "id(\\d) \\((\\d*), (\\d*),\\s*\\,*\\[(\\,*\\s*(\\D)\\[(\\d*)\\]\\[(\\d*)\\])*.*\\]\\)"

Используйте онлайн-тестер, чтобы сделать его лучше работать ...

первая группа идентификатор #, второй группировать нет, третья группа NO2, и вы должны затем получите элементы списка.

0

На самом деле нет причин создавать парсер вручную, так как есть несколько генераторов парсеров, JavaCC является самым популярным. Скелетный процесс.

  1. Определить язык с помощью BNF
  2. Перевести BNF на язык ввода генератор парсер понимает, убедившись, что сделать это либо влево или вправо рекурсивный рекурсивный в зависимости от обстоятельств. JavaCC требует правильной рекурсии.
  3. Вызвать генератор парсера для создания классов парсера.
  4. Увеличьте исходный код, вставив/уточнив источник генератора.

Есть много примеров

2

Не ваш язык, но в Python

import sys, re 

def regex(regex, str): 
    return [s for s in re.split(regex, str) if s] 

def parse(fname): 

    data = [] 

    with open(fname) as f: 
     data = f.read().splitlines() 

    header = regex('[, ]+', data[0]); 
    print header 

    for line in data[1:]: 
     fields = [regex('[(),]+', field)[0]  # Remove) (, 
        for field in line.split()] 

     fields[3] = fields[3][1:]    # Remove [ 
     fields[-1] = fields[-1][:-1]   # Remove ] 

     print fields[0], fields[1], fields[2], fields[3:] 

parse("file"); 

Output ('Файл' содержит текст):

$ python parse.py 
['id', 'no', 'no2', 'list'] 
id1 3 5 ['t[0][66]', 'y[5][626]'] 
id2 3 5 ['t[0][66]', 'y[5][626]', 'z[5][626]'] 
id2 3 5 ['t[0][66]', 'y[5][626]'] 
id3 32 54 ['t[0][66]', 'y[5][626]'] 
id4 3 541 ['t[0][66]', 'y[5][626]', 'u[5][626]', 'y[25][6226]'] 
id5 3 52 ['t[0][66]', 'y[5][626]'] 
id6 23 5 ['t[0][66]', 'y[5][626]'] 
Смежные вопросы