【发布时间】:2021-06-25 09:35:31
【问题描述】:
希望有人可以帮助我,因为我实际上已经花费了 12 多个小时来尝试解决这个问题 -
由于某些奇怪的原因,JSON 字符串中的逗号分隔字符串列表值被反序列化
'High','Low','Medium'
将an对象中的值设为:
'''High'',''Low'',''Medium'''
所有这些额外的单引号似乎破坏了一些东西,因此考虑通过正则表达式模式以某种方式删除它们,可能进一步拆分为一个列表并用正确数量的单引号将它们连接起来(值的任一侧,因为它在传入的 json 字符串上)。
我想我会尝试简单地提取一组匹配的引号之间的值,我发现了一个有效的模式,但后来发现它没有(见注释掉的部分)和我那里的第二个模式似乎适用于regex101,但我认为这只是突出了所有单引号对
//parameter.Value = Regex.Replace(parameter.Value, "/('+')/g", "'");
string[] values = Regex.Split(parameter.Value, @"/(?<![a-zA-Z])'|'(?![a-zA-Z])/g");
for (int j = 0; j < values.Length; j++)
values[j] = string.Format("'{0}'", values[j]);
parameter.Value = string.Join(",", values);
我希望有人能够帮助我指出我的模式可能出错的地方?我真的试过了,但是逗号分隔的列表本身可能包含逗号和特殊字符(包括撇号),这让它有点难。
任何帮助或指导表示赞赏
更新
感谢@Wiktor Stribiżew 向我指出了一个明显的思想失误,问题已解决。似乎在模式中使用了错误的方法以及字符串文字。
回复中的其他非常合理的选项,所以也感谢他们。
【问题讨论】:
-
不要在字符串文字中使用正则表达式文字。
@"(?<![a-zA-Z])'|'(?![a-zA-Z])"适合你吗? -
或许你可以匹配所有你想去掉的单引号
(?<=(?:^|,)'+)'|'+(?='(?:,|$))regex101.com/r/Dx3v3p/1 -
不要使用
Regex.Split,使用Regex.Replace(text, @"(?<![a-zA-Z])'|'(?![a-zA-Z])").Split(',') -
可能类似于ideone.com/bgtyOl
-
can ensure thanks to an sql trace- 在 sql 跟踪中应该有引号,否则它将是无效的 SQL。这将表明“将该列表进一步拆分为相关 SQL 的某处代码”实际上并没有这样做,或者做错了。我仍然不明白单引号是如何由于反序列化 json 而翻倍的。