【问题标题】:Find All values between single quotes (ignoring apostrophes)查找单引号之间的所有值(忽略撇号)
【发布时间】: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 向我指出了一个明显的思想失误,问题已解决。似乎在模式中使用了错误的方法以及字符串文字。

回复中的其他非常合理的选项,所以也感谢他们。

【问题讨论】:

  • 不要在字符串文字中使用正则表达式文字。 @"(?&lt;![a-zA-Z])'|'(?![a-zA-Z])" 适合你吗?
  • 或许你可以匹配所有你想去掉的单引号(?&lt;=(?:^|,)'+)'|'+(?='(?:,|$))regex101.com/r/Dx3v3p/1
  • 不要使用Regex.Split,使用Regex.Replace(text, @"(?&lt;![a-zA-Z])'|'(?![a-zA-Z])").Split(',')
  • 可能类似于ideone.com/bgtyOl
  • can ensure thanks to an sql trace - 在 sql 跟踪中应该有引号,否则它将是无效的 SQL。这将表明“将该列表进一步拆分为相关 SQL 的某处代码”实际上并没有这样做,或者做错了。我仍然不明白单引号是如何由于反序列化 json 而翻倍的。

标签: c# .net regex


【解决方案1】:

考虑到您的数据格式,即字段内没有逗号,您可以使用

var result = Regex.Replace(text, @"(?<![a-zA-Z])'|'(?![a-zA-Z])", "").Split(',');

关键是Regex.Split 用匹配“打破”字符串,而Regex.Replace 将替换所有匹配(这里,我使用的是空字符串,因此它将删除匹配)然后.Split(',') 将用逗号分隔结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-18
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    • 1970-01-01
    • 2016-04-23
    • 2011-03-20
    相关资源
    最近更新 更多