我有以下格式的一串键和值:
KEY1=someValue, KEY2="Hello, World!", SOME.OTHER.KEY=Hello World!, KEY4="Hello, ""World""!"
如何使用C#将其转换为JSON字符串?这可能可以使用正则表达式来完成,但是我无法提出正确的模式。我也无法弄清楚如何使用像这样的库来做到这一点Newtonsoft.Json
。
我要生成的JSON如下:
{
"KEY1":"someValue",
"KEY2":"Hello, World!",
"SOME.OTHER.KEY":"Hello World!",
"KEY4":"Hello, \"World\"!"
}
好吧,有了来自更新问题的嵌套引号,事情变得更加棘手。我看不到任何可行的方法来提取具有任意级别的嵌套引号的值。(对于regex方法而言,这是正确的-仍然可以手动扫描字符串并根据嵌套级别计算后续引号的数量。)
假设我们只限制一层嵌套的带引号的字符串,则正则表达式为:
(?<key>[^=,\s]+)=(?:"(?<value>(?:[^"]|""[^"]*"")*?)"|(?<value>[^,]*))(?:,|$)
然后,您可以找到所有匹配项,并根据JSON规则重新格式化对:
var input = @"KEY1=someValue, KEY2=""Hello, World!"",
SOME.OTHER.KEY=Hello ""World""!,
KEY4=""Hello, """"World""""!"",
KEY5=""Hello, """"World""""!"",
KEY6=""""""Hello"""", """"World""""!""";
var pairs = Regex.Matches(input, @"(?<key>[^=,\s]+)=(?:""(?<value>(?:[^""]|""""[^""]*"""")*?)""|(?<value>[^,]*))(?:,|$)")
.Cast<Match>()
.Select(m =>
string.Format(" {0}: {1}",
JsonConvert.ToString(m.Groups["key"].Value),
JsonConvert.ToString(m.Groups["value"].Value.Replace("\"\"", "\""))));
var json = "{\n" + string.Join(",\n", pairs) + "\n}";
正则表达式说明:
(?<key>
-启动一个名为的捕获组 key
[^=,\s]+
-匹配任何字符非空序列排除=
,,
和空格)
-结束key
小组=
-从字面上匹配等号(?:
-启动一个未命名的组,用于对备选方案进行分组
"
-文字开头的报价(?<value>
-启动一个名为的捕获组 value
(?:[^"]|""[^"]*"")*
-匹配任何非引号或带引号的字符串序列(请不要将引号加倍)?
-使之前的比赛不贪心)
-结束value
小组"
-文字结尾的报价|
-替代分隔符(?<value>
-启动另一个value
捕获组-.NET正则表达式主体维护一堆命名组,因此您可以简单地通过名称访问任何一个可选捕获组
[^,]*
-匹配任何不包含逗号的序列)
-结束第二value
组)
-结束未命名的小组(?:,|$)
-匹配逗号或字符串末尾(均应匹配该值)本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句