Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript正则表达式替换字符串中的所有双引号,除非双引号后跟空格或逗号空格_Javascript_Regex_Json - Fatal编程技术网

javascript正则表达式替换字符串中的所有双引号,除非双引号后跟空格或逗号空格

javascript正则表达式替换字符串中的所有双引号,除非双引号后跟空格或逗号空格,javascript,regex,json,Javascript,Regex,Json,我遇到了一个问题,即有人没有正确地将值中的双引号转义为JSON字符串 字符串示例: {"description":"This is my 12" pizza I ordered.","value":"1"} 当我试图让JSON.parse()处理这个问题时,它给出了一个错误,因为未加scape的双引号(指以英寸为单位的大小) 起初,我想——只要做: string.replace(/\"/g,'\"'); 但当然,这也逃脱了所有有效的双引号。所以,我不是正则表达式的专家,但我四处寻找一些答案,

我遇到了一个问题,即有人没有正确地将值中的双引号转义为JSON字符串

字符串示例:

{"description":"This is my 12" pizza I ordered.","value":"1"}
当我试图让JSON.parse()处理这个问题时,它给出了一个错误,因为未加scape的双引号(指以英寸为单位的大小)

起初,我想——只要做:

string.replace(/\"/g,'\"');
但当然,这也逃脱了所有有效的双引号。所以,我不是正则表达式的专家,但我四处寻找一些答案,我认为这需要一个消极的前瞻

是否有人可以帮助构造一个正则表达式来查找(替换)任何doublequote序列,其中出现问题的doubleqoute后面的下一个2字符序列不是空格逗号

我知道这不是一个完全通用的解决方案(让患者自行解决可能会是),但不幸的是,我没有通用解决方案的奢侈

短暂性脑缺血发作

更新-不考虑示例字符串(仅用于说明)。是否可以在每个doublequote之前和之后测试是否存在有效的JSON-ie以查找以下任何字符 ,{[:


在每次双引号前后?我想这就是我要问的-这可以通过lookahead/behind regex实现吗?

一种方法:重新生成json字符串:

var str = '{"description":"This is my 12" pizza I ordered.","value":"1"}';
var regex = /"(.*?)"(?=\s*([,:])\s*"|(}))/g;
var result = '{';

var arr = regex.exec(str);

while (arr != null) {
    result += '"' + arr[1].replace(/\\?"/g, '\\"') + '"';
    if (arr[2]) result += arr[2];
    if (arr[3]) result += arr[3];
    arr = regex.exec(str);
}

console.log(result);

不是一行正则表达式,但我认为这样做更安全:

 json_string = '{"description":"This is my 12" pizza: which can also contain other "," which would break in a one liner regex.","value":"1"}';
 console.log(json_string);

 // save the value for later use
 var value = json_string.match(/"value":"(.+)"}$/)[1];

 // isolate just the description value..

 // remove the ","value... from the end
 var desc = json_string.replace(/","value":".+"}$/, '');

 // remove the opening {"description":" from the description value
 desc = desc.replace(/^{"description":"/, '');

 // any remaining " in the description are unwanted to replace them
 desc = desc.replace(/"/g, '"');
 console.log(desc);

 // now put it all back together - if you wanted too - but really you already have the description and value parsed out of the string
 json_string = '{"description":"'+desc+'","value":"'+value+'"}'

 console.log(json_string);
控制台输出如下所示:

{"description":"This is my 12" pizza: which can also contain other "," which would break in a one liner regex.","value":"1"}

This is my 12" pizza: which can also contain other "," which would break in a one liner regex.

{"description":"This is my 12" pizza: which can also contain other "," which would break in a one liner regex.","value":"1"}
注意如果描述中还包含您可能作为regex one-liner的一部分使用的任何模式,则此方法不会中断

尝试以下替换:

repl = str.replace(/"(?= )/g, "\\\"");

下面是我能做的最好的事情,利用JSON中的一个事实,一个未被替换的引用只能出现在某些地方

input = '{"description":"This is my 12" pizza, and I want "thin crust"","value":"1"}';
console.log(input);
output = input.replace(/{"/g, '_OPEN_').replace(/":"/g, '_COLON_').replace(/","/g, '_COMMA_').replace(/"}/g, '_CLOSE_');
output = output.replace(/"/g, '\\"');
output = output.replace(/_OPEN_/g, '{"').replace(/_COLON_/g, '":"').replace(/_COMMA_/g, '","').replace(/_CLOSE_/g, '"}');
console.log(output)
产生

{"description":"This is my 12" pizza, and I want "thin crust"","value":"1"}
{"description":"This is my 12\" pizza, and I want \"thin crust\"","value":"1"}

你可以用不太可能出现在输入中的字符串替换“打开”、“关闭”等,如果你不介意正则表达式是神秘的,甚至可以替换控制字符。但正如其他人所指出的,没有任何解决方案可以在所有情况下都起作用。无论你做什么,描述文本中可能会出现一个值,这会让你陷入困境,因为se与正确生成的JSON不同,您试图解析的语法是不明确的。

我讨厌回答我自己的问题,正如你们中的许多人指出的,正确地说,由于一个不正确的、未转义的双引号字符所注入的模糊性,事后修复错误的JSON是不可能的。也许这应该是正确的ans呃,不幸的是这不能解决我的问题

对于那些碰到这个问题的人,我希望下面的函数有助于辅助,直到你得到错误的JSON固定的来源。本质上,你必须看每一个双引号,然后在两个字符前面和后面并列(至少)。并根据上一个/下一个字符评估它是否可能在JSON中有效使用doubleqoute或无效。如果它无效,请拼接一个转义字符。下面的函数可以很好地执行此操作,但取决于由于双引号导致的JSON异常的程度,您可能需要稍微扩展此函数。我希望至少对于我这样的人来说,这至少提供了一个良好的起点

多亏了这些贡献——潜在解决方案的数量和广度之多让人惊叹不已

// fix unescaped double quotes / malformed JSON
function cleanseJSON(jsonStr)
{
  for(var k=0;k<jsonStr.length;k++)
  { 
    if(jsonStr.charAt(k)=='"')
    {
      var prevChar=jsonStr.charAt(k-1);
      var prevChar2=jsonStr.charAt(k-2);
      var nextChar=jsonStr.charAt(k+1);
      var nextChar2=jsonStr.charAt(k+2);
      var esc="\\";
      var isValid=false;
      var prevFix=false;
      var postFix=false;

      switch(prevChar)
      {
        case ':':
        case '{':
        case ',':
        case '[':
        case '\\':   // already escaped
          isValid=true;
          break;
        default:
          prevFix=true;
      }

      switch(nextChar)
      {
        case ':':
        case '}':
        case ',':
          if(nextChar2==' '){   // if there is a comma, but the next is a space consider it invalid JSON
            break;  
          }
        case ']':
        case '\\':   // already escaped
          isValid=true;
          break;
        default:
          postFix=true;
      }
      // first test to ensure the quote is likely bogus
      if(!isValid)
      {
        if(prevFix){
          jsonStr = [jsonStr.slice(0, k), esc, jsonStr.slice(k)].join('');   
        } else {
          if(postFix){
            jsonStr = [jsonStr.slice(0, k+1), esc, jsonStr.slice(k+1)].join('');
          }
        }
      } // if not valid "
    } // if we find a doublequote
  } // for each char in the jsonStr
  return jsonStr;
}
//修复未替换的双引号/格式错误的JSON
函数cleanseJSON(jsonStr)
{

对于(var k=0;k这最好在创建时完成;您如何创建JSON?当您打开“东西”时使用json.stringify将对象转换为json对象时,它应该会自动为您转义。您不需要自己这样做;您可以演示如何构建要转换为json的对象吗?您要求的正则表达式不会解决您的问题,因为单词“description”、“this”和“valu”前面的双引号e'不应该转义,但后面不会紧跟逗号或空格字符。您如何处理这种情况?
{“description”:“我想要一个10”,或者可能是一个12”,并将其设置为“薄壳”}
要做到这一点非常困难。纠正JSON不仅仅是一个“通用”的问题修复,这是唯一的修复。为什么他们用手工生成而不是使用适当的JSON字符串生成器?服务器代码使用什么语言?每种流行的服务器语言都有一个JSON生成器。为了回答格式错误的JSON字符串的来源问题,我没有创建字符串,所以我无法修复它。我理解这一点获得正确的JSON是唯一真正的解决方案,但如果这不可能,我正在寻找一个尽可能健壮的替代方案。相信我-我不喜欢将糟糕的JSON作为唯一的解决方案!如果您确定描述内容,这是好的,因为值:{“description”:“This,“pizza”,“is my 12”pizza,我订购了。”,”值“:“1”}不适用于此解决方案,而在上面的我的解决方案中则适用。