0

次のような文字列を取得したいと思います。

[One, Two[A, B[i, ii, iii, iv], C], Three]

そして、それをリストの階層に変換して、次のようなコードを実行すると:

Console.Write(myList[1][1][2]);

出力は次のようになります。

iii

これは、C# で記述された単純な解析コードが存在する十分に一般的な要件であることを願っています。

私の質問をもっと明確に表現できるかどうか教えてください。

4

5 に答える 5

4

XML やJSONは、このようなものを格納するための優れた方法です。

スペンスが言ったように、これは難しい問題です。

ほとんどの言語での実装については、その JSON リンクの一番下までスクロールします。

于 2009-01-19T01:47:54.613 に答える
2

正規表現を使用する必要があります。部分文字列の一致と部分式により、サブサブ... レベルを取得するための再帰が得られます。

preg で /^\[(.+)\]$/ のようなものを使用して、単一レベルのアイテムを収集します。レベルを取得しなくなるまで処理し、単一のシリーズの根性を取得した後、「、」で爆発します。

結果を「,」で分割します。

のように出てくるはずです

  • [1、2[A、B[i、ii、iii、iv]、C]、3]
    • 1
    • [A、B[i、ii、iii、iv]、C]
      • B
      • [i、ii、iii、iv]
        • ii
        • iii
        • iv

最後に、左/右のスペースを切り取って、洗練された結果を取得します。

于 2009-01-19T01:57:09.103 に答える
0

フォーマットを制御できる場合は、XML、JSON、または別のフォーマットにも投票します。しかし、それが欠けているので、私が退屈していたので、ここにパーサーのPython実装があります。

class ExprParser(object):
current = []
list_stack = []

def __init__(self):
    pass

def parse(self,input):
    for atom in [s.strip() for s in input.split(',')]:
        self.parse_atom(atom)
    return self.current

def do_pushes(self,atom):
    """ Strip off the '[' and push new lists """
    i = 0
    while i < len(atom) and atom[i] == '[':
        self.push()
        i += 1
    return atom[i:]

def do_pops(self,atom):
    """ Pop the lists """
    i = 0
    while i < len(atom) and atom[i] == ']':
        self.pop()
        i += 1

def parse_atom(self,atom):
    push_start = atom.find('[')

    rest = self.do_pushes(atom[push_start:]) if push_start >= 0 else atom

    pop_start = rest.find(']')

    val = rest[:pop_start] if pop_start >= 0 else rest

    self.add(val)

    if pop_start >= 0:
        self.do_pops(rest[pop_start:])

def push(self):
    self.current = []
    self.list_stack.append(self.current)

def pop(self):
    done = self.list_stack.pop()
    self.current = self.list_stack[-1] if self.list_stack else done
    if self.current is not done:
        self.add(done)

def add(self,val):
    self.current.append(val)

次のように使用します:

parser = ExprParser()
parser.parse('[One, Two[A, B[i, ii, iii, iv], C], Three]')

不正な入力の場合でもエラー処理はありません。

于 2009-01-19T03:40:02.700 に答える
0

配列またはリストを求めていますか?

スペースや要素内でのコンマの使用などを処理する必要があるため、これを文字列で行うのは非常に困難です。

このリストの内容を制御できる場合は、これを行うのに役立つライブラリがある XML またはバイナリ シリアル化を調べることをお勧めします。

于 2009-01-19T01:46:05.817 に答える
0

これは実用的な答えではありませんが、.NET 4.0 ベータ版を使用できる場合は、Microsoft がテキスト DSL 用に開発している Oslo (およびその後のツール) を調べることができます。これはまさに必要なもののようです。

于 2009-01-19T01:53:48.127 に答える