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 回答