如何解析这样的文字?

时间:2014-02-07 14:53:58

标签: java c parsing

            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代码会很棒,但任何语言或伪代码或常规语言都可以。

3 个答案:

答案 0 :(得分: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");

输出('文件'包含您的文字):

$ 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]']

答案 1 :(得分:0)

我试图制作一个正则表达式来提取数据,但我没时间完成它。

这是我到目前为止所拥有的:"id(\\d) \\((\\d*), (\\d*),\\s*\\,*\\[(\\,*\\s*(\\D)\\[(\\d*)\\]\\[(\\d*)\\])*.*\\]\\)"

使用在线测试仪让它更好地工作......

第一组是id#,第二组是no,第三组no2,之后你应该得到列表项。

答案 2 :(得分:0)

没有理由手动创建解析器,因为有多个解析器生成器可用,JavaCC是最受欢迎的。骨架过程是。

  1. 使用BNF定义语言
  2. 将BNF转换为解析器生成器理解的输入语言,确保使其保持递归或正确递归。 JavaCC需要正确的递归。
  3. 调用解析器生成器以创建解析器类。
  4. 通过插入/优化生成器源来扩充生成的源代码。
  5. 有很多例子