Javascript regex替换字符串中的所有双引号,除非双引号后面跟着空格或逗号空格
javascript regex replace all doublequotes in string unless the doublequote is followed by space or comma space
我有一个问题,有人没有正确转义值中的双引号稍后被解释为JSON字符串。
字符串的例子:
{"description":"This is my 12" pizza I ordered.","value":"1"}
当我尝试让JSON.parse()处理这个问题时,它给出了一个错误,因为未转义的双引号(指以英寸为单位的大小)
一开始,我想-只要:
string.replace(/'"/g,''"');
,当然这也会转义所有有效的双引号。所以,我不是正则表达式方面的专家,但我四处寻找了一些答案,我认为这需要一个消极的展望?
有人可以帮助构建一个正则表达式查找(用于替换)双引号的任何序列,其中下一个2字符序列后面的违规双引号不是空格逗号?
我知道这不是一个完全通用的解决方案,(让人们自己解决),但不幸的是,我没有一个通用的解决方案。
TIA
Update -而不是考虑示例字符串(仅用于说明)。是否有可能在每个双引号之前和之后测试有效JSON的存在-即寻找以下任何字符, {[:
双引号前后的?我想这就是我要问的-这可以用向前看/向后regex完成吗?
这是我能做到的最好的,利用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"}
您可以将'OPEN', 'CLOSE'等替换为不太可能在输入中出现的字符串,如果您不介意正则表达式是隐式的,甚至可能是控制字符。但正如其他人所指出的,没有一种解决方案在所有情况下都有效。无论您做什么,描述文本中都有可能出现一个值,它会把您搞得一团糟,因为与正确生成的JSON不同,您试图解析的语法是不明确的。
试试这个替换:
repl = str.replace(/"(?= )/g, "'''"");
不是一个单行正则表达式,但我认为这样做更安全:
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"}
注意这个方法不会破坏,如果描述也包含任何模式,你可能会使用在一个正则表达式的一部分
一种重建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是不可能的,因为一个不可靠的、未转义的双引号字符注入了歧义。也许这应该是一个正确的答案,不幸的是它不能解决我的问题。
对于那些遇到同样问题的人-我希望下面的函数可以帮助解决问题,直到您可以获得错误JSON的来源。本质上,您必须查看每个双引号,然后查看两个字符(至少)的前后,并根据前/下一个字符评估它在JSON中是否可能有效使用双引号或无效。如果无效,则插入转义字符。下面的函数在这方面做得很好,不过,根据双引号导致的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;
}
- Javascript,有没有一种方法可以将数组写成没有逗号或空格的单个文本字符串
- 如何将字符串拆分为字符,但在javascript中保留空格
- Javascript Regexp-不接受空格,但应该接受
- 如何替换JavaScript字符串中除字母和数字之外的所有内容(空格/符号)
- JavaScript从字符串中删除尾随空格和句点
- 需要javascript函数允许逗号和空格
- 在php和javascript onClick之间传递带有空格的值
- 用于在Javascript中删除多个空格的特殊字符
- JavaScript Regex,用于由特定字符串包围的数字和空格
- 简单的Javascript方式,在输入字段的每5位数字后添加一个空格
- 如何在城市和州代码之间用逗号将城市和州从短划线格式化为空格.(javascript)
- javascript在其中设置空格时会中断
- 正则表达式匹配空白或空格 JavaScript
- 传递“&”和空格 javascript
- 禁用文本区域中的多个空格 JavaScript
- 正则表达式检查字符串是否仅包含字母数字字符和空格 - javascript
- 如何将字符串中的逗号替换为空格-javascript
- 按空格 javascript 拆分字符串
- 在文本区域中保留空格(JavaScript变量)
- 替换空格javascript