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