1

プロローグ:

入力文字列:1(2),3,4(5,6(7,8),9),10

私はC#を使用していますが、最終的にList<foo>上記の式から取得したいと思います

public class foo
{
    public int bar { get; set; }
    public List<foo> listOfFoo { get; set; }
}

いくつかの検証を記述し、文字ごとに解析することでタスクを達成できますが、より良い方法を知りたいです。コードが少ないほど、彼らが言うバグは少なくなります;)

クエリ

次のような文字列で情報を検証し、場合によってはキャプチャするための正規表現を探しています

1(2),3,4(5,6(7,8),9),10

文字列は、基本的にコンマで区切られた一連の数字です。ただし、数値には、括弧を使用していくつかのサブ式を含めることができます( )

文字列から取得したいのは、次のようなグラフです

1
    2
3
4
    5
    6
        7
        8
    9
10

私は正規表現についてほとんど考えていません。私はそれらのほとんどを読んで理解することができますが、書くのは本当に難しいと思います

このようなことが RegEx を使用して実現可能かどうか教えてくれる人を探しています。もしそうなら、アプローチはどうあるべきですか?再帰式が必要になることがわかります。リンクや例は非常に役立ちます。私に正規表現自体を喜んで提供してくれる人は、ケーキのアイシングになるでしょう :)

4

1 に答える 1

2

.NET regex には、この場合のようにバランスの取れた括弧を数えて一致させることができるバランス グループがあります。

そのためには、次のような式を使用できます。

(?x)                 # ignore spaces and comments
^
(?:
    (?<open> \( )*   # open++
    \d+
    (?<-open> \) )*  # open--
    (?:
        , (?!\z)     # match a , but not at end of string
    |   \z           # or end of string
    )
)+
\z
(?(open) (?!) )      # fail if unbalanced (open > 0)

これは、文字列を検証しますが、解析しません。あなたが望むようなツリーを構築するには、パーサーを使用する必要があると私は信じています。

于 2013-04-04T13:08:23.517 に答える