使用正则表达式删除引号内的引号

时间:2013-01-29 13:30:53

标签: javascript regex json

我有一个json文件,在值中有很多双引号。 json文件差不多有27000条记录。

我想删除或替换值中的双引号,否则它不被接受为一个好的json文件。我怎么能这样做?

问题是在值中有一个双引号的记录,但也有记录中有多个引号。

除了替换或删除引号外,还可以删除整个键和值。反正我也不会用它。这样做更容易吗?

以下是json文件中1条记录的示例:

 {
  "adlibJSON": {
    "recordList": {
      "record": [
        {
          "@attributes": {
            "priref": "4372",
            "created": "2011-12-09T23:09:57",
            "modification": "2012-08-11T17:07:51",
            "selected": "False"
          },
          "acquisition.date": [
            "1954"
          ],
          "documentation.title": [
            "A lot of text with a lot of extra double quotes like "this" and "this""
          ] ... ...

问题在于密钥的值:document.title。 我有崇高的文字2,我用来查找和替换。

3 个答案:

答案 0 :(得分:1)

有一种方法,但为了做到这一点,你必须确保你可以对你的数据做以下假设:

  • “documentation.title”只有在数据用作密钥时才会出现一次。
  • “documentation.title”引用的数组值应该只有一个元素。
  • 字符“]”不应出现在值中。

然后你会遵循这些步骤:

/* find first index of "[" after "documentation.title" */
n = s.indexOf("[", s.indexOf('"documentation.title"'));

/* Find index of closing "]" */
n2 = s.indexOf("]", n);

/* Get the substring enclosed by these indexes */
x = s.substr(n+1, n2-n-1);

/* Remove every double quotes in this string and rebuild the original string with the corrected value. */
s.substr(0, n) + '["' + x.replace(/"/g, "") + '"]' + s.substr(n2+1);

编辑:如果您对保留更正的值本身不感兴趣,可以用空字符串替换它。

答案 1 :(得分:0)

我不认为你可以it's not a regular language

你可能会遇到与parsing HTML with regex相同的麻烦。

我认为你必须自己编写(或者发现你是否超级幸运)某种解析器......

答案 2 :(得分:0)

试试这个:

json.replace(/(^\s*|:\s*)"/gm, '$1[sentinel]')
    .replace(/"(,?\s*$|:)/gm, '[sentinel]$1')
    .replace(/"/g, '\\"').replace(/\[sentinel\]/g, '"');

在这里演示:http://jsfiddle.net/D83FD/

这不是一个完美的解决方案;数据的格式可能会破坏正则表达式。试一试,看看它是否适用于更大的数据集。

基本上我们正在寻找开头报价并用占位符值替换它们,找到结束引号并用占位符替换它们,反斜杠 - 转义所有剩余的引号,然后再用引号替换占位符。