0

次の文字列を分割したい

// Comments
KeyA : SomeType { SubKey : SubValue } KeyB:'This\'s a string'
KeyC : [ 1 2 3 ] // array value

の中へ

KeyA
:
SomeType
{ SubKey : SubValue }
KeyB
:
This's a string
KeyC
:
[ 1 2 3 ]

(: と空白は区切り文字ですが、: は結果に保持されます。コメントは無視されます。{}、[]、または '' の間で分割されません)

正規表現の分割または一致でそれを達成できますか? もしそうなら、どのパターンが正しいでしょうか?パターン文字列へのコメントをお待ちしております。

さらに、入力文字列が有効でない場合は、例外をスローするか、エラー メッセージを返すことも望ましいです (以下のコメントを参照)。

ありがとう。

4

3 に答える 3

1

このパターンを使用できます...

string pattern = @"(\w+)\s*:\s*((?>[^\w\s\"'{[:]+|\w+\b(?!\s*:)|\s(?!\w+\s*:|$)|\[[^]]*]|{[^}]*}|\"(?>[^\"\\]|\\.)*\"|'(?>[^'\\]|\\.)*')+)\s*";

... 2 つの方法で:

  1. グループ1のキーとグループ2の値で探しているものを提供するMatchメソッドを使用
  2. Split メソッドを使用しますが、空の結果をすべて削除する必要があります。

:パターンの 2 番目の部分 ( の後) はどのようにビルドされますか?

アイデアは、まず問題のある文字を避けることです:[^\w\s\"'{[:]+ 次に、これらの文字をそれぞれ許可しますが、特定の状況で:

  • \w+\b(?!\s*:)キーではない単語
  • \s(?!\w+\s*:|$)値の末尾にないスペース (トリムするため)
  • \[[^]]*]角括弧で囲まれたコンテンツ
  • {[^}]*}中括弧と同じ
  • "(?>[^"\\]|\\\\|\\.)*"二重引用符で囲まれたコンテンツ (エスケープされた二重引用符は許可されています)
  • '(?>[^'\\]|\\\\|\\.)*'一重引用符と同じ

括弧または引用符内のコロンに関する問題は回避されることに注意してください。

于 2013-09-07T02:03:37.033 に答える