【问题标题】:How do I replace a double quote inside double quoted string using javascript and regular expressions?如何使用 javascript 和正则表达式替换双引号字符串中的双引号?
【发布时间】:2012-09-10 09:55:19
【问题描述】:

如何使用正则表达式为下面的 JSON 字符串转义双引号内的双引号 (")?

[{
     "LDAP_ID":"a",
     "LAC_NO":"1153274",
     "ACTION":"VBE",
     "DATE_OF_ACTION":"06-01-2006 AM 12:00:00",
     "RESPONSE":"DPP",
     "DEF_OBSERV":"M",
     "REMARK":"visited b"         s emp & rcd 1 emi",
     "OPR_ID":"FCTV1",
     "ACTION_TO_BE":"",
     "ACTION_TO_BE_DT":"",
     "AMOUNT_TOBECHG":"",
     "DELEGATED_TO":"",
     "BRANCH_CODE":"100",
     "DISP_DATE_OF_ACTION":"06-JAN-06",
     "DISP_ACTION_TO_BE_DT":"",
     "SRNO":"142871",
     "DELETED_FLAG":"",
     "TIMESTAMP":"10-08-2012 AM 11:38:30",
     "STAMPDATETIME":"2012-08-10 11:38:30"
}]

需要转义的关键行:

"REMARK":"visited b"         s emp & rcd 1 emi",

【问题讨论】:

  • 您只是想替换每 4 个“中的第 2 个和第 3 个”,还是要替换一行中的每个“除了外部两者?
  • 你损坏的 JSON 也破坏了语法高亮:P
  • 你至少能确定任何错误的引用只会出现在:之后的值字段中吗?

标签: javascript regex json


【解决方案1】:

这个问题不能用正则表达式来解决。您甚至可以想出一种适用于 99% 的情况的方法,但仅此而已。

无效的 JSON 无效,必须由服务器端的人员修复。正则表达式并非旨在解决此类问题。你最好在服务器端修复它。

【讨论】:

    【解决方案2】:

    使用正则表达式修复 JS 中无效 JSON 的唯一方法是将其作为字符串接收,进行替换,然后将其重新评估为 JSON。最后一步可能不安全。这里有一个类似问题的问题:Convert object string to JSON

    所以我建议在收到 JSON 之前修复它。无论如何,如果你不能,这里有一个正则表达式的解决方案。

    正则表达式仅在值的分隔符之间起作用:" 和 ",以确保仅对值内的双引号进行转义(edited)。

    :\s*"[^"]*"[^"]*"\s*(,|\s*\})
    

    这是替换的完整代码(正则表达式编辑):

    var str = '[{ "LDAP_ID":"a", "LAC_NO":"1153274", "ACTION":"VBE", "DATE_OF_ACTION":"06-01-2006 AM 12:00:00", "RESPONSE":"DPP", "DEF_OBSERV":"M", "REMARK":"visited b" s emp & rcd 1 emi", "OPR_ID":"FCTV1", "ACTION_TO_BE":"", "ACTION_TO_BE_DT":"", "AMOUNT_TOBECHG":"", "DELEGATED_TO":"", "BRANCH_CODE":"100", "DISP_DATE_OF_ACTION":"06-JAN-06", "DISP_ACTION_TO_BE_DT":"", "SRNO":"142871", "DELETED_FLAG":"", "TIMESTAMP":"10-08-2012 AM 11:38:30", "STAMPDATETIME":"2012-08-10 11:38:30" }]'
    
    var j = str.replace(/(:\s*"[^"]*)"([^"]*"\s*(,|\s*\}))/g, '$1\\"$2');
    
    var json = JSON.stringify(eval("(" + j + ")"));
    

    【讨论】:

    • Seems broken。如果你去掉最后的逗号,它仍然是坏的
    • 这是一个工作的 jsFiddle,代码与上面相同:jsfiddle.net/Y4nYS 这是 regex alone 使用所提供的输入。
    • 但是你展示了一个很好的例子。使用零个或多个运算符而不是一个或多个可以修复它: :\s*"[^"]*"[^"]*"\s*,
    • 如果损坏的字符串是对象中的最后一个字符串,逗号仍然会阻止它工作:)
    • 好的,又发现了:) :\s*"[^"]*"[^"]*"\s*(,|\s*\})
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-01
    • 1970-01-01
    • 2012-11-24
    • 2015-01-22
    • 1970-01-01
    • 2011-12-07
    • 2018-01-25
    相关资源
    最近更新 更多