1

JSON.Net 解析ライブラリを使用して、次の例の json をテキスト ファイルから文字列に読み込もうとしています。

C:\temp\regeLib.json の内容

{
    "Regular Expressions Library":
    {
      "SampleRegex":"^(?<FIELD1>\d+)_(?<FIELD2>\d+)_(?<FIELD3>[\w\&-]+)_(?<FIELD4>\w+).txt$"
    }
}

試して解析するコード例:

Newtonsoft.Json.Converters.RegexConverter rConv = new Newtonsoft.Json.Converters.RegexConverter();
        using (StreamReader reader = File.OpenText(libPath))
        {
          string foo = reader.ReadToEnd();
          JObject jo = JObject.Parse(foo);//<--ERROR

          //How to use RegexConverter to parse??
          Newtonsoft.Json.JsonTextReader jtr = new Newtonsoft.Json.JsonTextReader(reader);
          JObject test = rConv.ReadJson(jtr);//<--Not sure what parameters to provide
          string sampleRegex = test.ToString();
        }

コンバーターを使用する必要があるようです。上記のコードが間違っていることはわかっていますが、これが可能かどうかを説明する例が見つかりません。JSON.Netを使用してテキストファイルから文字列に正規表現トークンを読み取ることは可能ですか? どんな助けでも大歓迎です。

アップデート:

さらに遊んでみて、文字クラスをエスケープする必要があることがわかりました。以下の修正を行うと、JObject に解析し、LINQ を使用して正規表現パターンを照会することができました。

訂正内容 C:\temp\regeLib.json

{
    "Regular Expressions Library":
    {
      "SampleRegex":"^(?<FIELD1>\\d+)_(?<FIELD2>\\d+)_(?<FIELD3>[\\w\\&-]+)_(?<FIELD4>\\w+).txt$"
    }
}

修正コード

using (StreamReader reader = File.OpenText(libPath))
        {
          string content = reader.ReadToEnd().Trim();
          JObject regexLib = JObject.Parse(content);
          string sampleRegex = regexLib["Regular Expressions Library"]["SampleRegex"].ToString();

          //Which then lets me do the following...
          Regex rSampleRegex = new Regex(sampleRegex);

          foreach (string sampleFilePath in Directory.GetFiles(dirSampleFiles, "*"))
          {
            filename = Path.GetFileName(sampleFilePath);
            if (rSampleRegex.IsMatch(filename))
            {
              //Do stuff...
            }
          }
        }

これが最善のアプローチかどうかはわかりませんが、私の場合はうまくいくようです。

4

1 に答える 1

0

なぜこんなに小さな正規表現を json ファイルに保存しなければならないのか理解できません。将来、正規表現を拡張する予定はありますか?

もしそうなら、これを行うのではなく

JObject regexLib = JObject.Parse(content);
string sampleRegex = regexLib["Regular Expressions Library"]["SampleRegex"].ToString();

json2csharpを使用してクラスを作成することを検討してください。少なくとも、強く型付けされ、より保守しやすくなります。

より適切なjsonは次のようになると思います(仮定):

{
    "Regular Expressions Library": [
        {
          "SampleRegex": "^(?<FIELD1>\\d+)_(?<FIELD2>\\d+)_(?<FIELD3>[\\w\\&-]+)_(?<FIELD4>\\w+).txt$"
        },
        {
          "SampleRegex2": "^(?<FIELD1>\\d+)_(?<FIELD2>\\d+)_(?<FIELD3>[\\w\\&-]+)_(?<FIELD4>\\w+).txt$"
        }
    ]
}

この方法で正規表現を「設定」ファイルに保存する方が理にかなっています

于 2013-06-12T09:22:16.200 に答える