C# でいくつかの入力を解析していますが、RegEx 処理で壁にぶつかっています。
免責事項: 私は正規表現の専門家ではありませんが、さらに学習しています。
次のような入力文字列があります。
ObjectType [プロパティ 1 = 値 1、プロパティ 2 = 値 2、プロパティ 3 = 別のオブジェクト タイプ [プロパティ 4 = 値 4]]
(不自然な値ですが、重要なことは、これらをネストできることです)。
文字列をトークン化するために次のことを行っています。
Regex Tokenizer = new Regex(@"([=\[\]])|(,\s)");
string[] tokens = Tokenizer.Split(s);
これで約98%正解です。これにより、既知の区切り記号で文字列が分割され、カンマの後に空白が続きます。
上記の例のトークンは次のとおりです。
ObjectType
[
property1
=
value1
,
property2
=
value2
,
property3
=
AnotherObjectType
[
property4
=
some value4
]
]
しかし、私には2つの問題があります:
1) プロパティ値にはコンマを含めることができます。これは有効な入力です:
ObjectType [property1=This is a valid value, and should be combined,, property2=value2, property3=AnotherObjectType [property4=value4]]
property1= の後のトークンを次のようにしたいと思います。
This is a valid value, and should be combined,
そして、トークン内の空白を保持したいと思います。現在、コンマが見つかったときに分割されます。
2) 分割すると、カンマ トークンに空白が含まれます。可能であればこれを取り除きたいのですが、これはそれほど重要ではありません。
私はさまざまなオプションを試しましたが、それらはすべて私を部分的にそこに導きました。私が持っていた最も近いものはこれです:
Regex Tokenizer = new Regex(@"([=\[\]])|(,\s)|([\w]*\s*(?=[=\[\]]))|(.[^=]*(?=,\s))");
区切り記号、コンマの後に空白、単語文字の後にリテラルの前の空白、およびコンマと空白の前のテキスト (= 記号は含まれません) を一致させるために。
分割を呼び出す代わりに一致を取得すると、次のようになります。
ObjectType
[
property1
=
value1
,
property2
=
value2
,
property3
=
AnotherObjectType
[
property4
=
value4
]
]
property4 からの情報が欠落していることに注意してください。より複雑な入力では、次のようにトークンに閉じ括弧が含まれることがあります。 value4] なぜそうなっているのかわかりません。これを改善する方法についてのアイデアはありますか?
ありがとう、フィル