JavaScript正则表达式以匹配数组中的数字

JavaScript正则表达式以匹配数组中的数字,javascript,regex,replace,match,Javascript,Regex,Replace,Match,我有以下案文: {"status": "ok","data": {"grpd": 0,"obj": 073741824,"objInst": 0,"no": null,"values": [3.523422,0,-323123123,3.423,9223372036854775807,0,"test 123.32",0,0,"",0,0]}} 我需要匹配数组“values”中的数字并在其周围加引号,因此其结果应该是: {"status": "ok","data": {"grpd": 0,"

我有以下案文:

 {"status": "ok","data": {"grpd": 0,"obj": 073741824,"objInst": 0,"no": null,"values": [3.523422,0,-323123123,3.423,9223372036854775807,0,"test 123.32",0,0,"",0,0]}}
我需要匹配数组“values”中的数字并在其周围加引号,因此其结果应该是:

 {"status": "ok","data": {"grpd": 0,"obj": 073741824,"objInst": 0,"no": null,"values": ["3.523422","0","-323123123","3.423","9223372036854775807","0","test 123.32","0","0","","0","0"]}}

数字可以是浮点数、负数和正态数

首先将它们解析为JS对象

var obj = JSON.parse( jsonString );
然后

将其转换回JSON字符串格式

jsonString  = JSON.stringify( obj );
但是,如果数字超出了javascript对象可以接受的范围,那么使用这个基于正则表达式的解决方案

var str='{“status”:“ok”,“data”:{“grpd”:0,“obj”:073741824,“objInst”:0,“no”:null,“value”:[3.523422,0,-323123123,3.4239223372036854775807,0,“test 123.32”,“0,0”,“0,0]};
str=str.replace(/[,\[](\-){0,1}\d+(\.\d+*(?=[,\]])/g,函数(match){var firstChar=match.charAt(0);match=match.substring(1);返回firstChar+“\”“+match+”\”;);

console.log(str)如果您真的需要通过正则表达式来实现,那么您可以试试这个

const regex=/(?\d+(\.\d+)?(![^,]*)/g;
const str=`{“status”:“ok”,“data”:{“grpd”:0,“obj”:073741824,“objInst”:0,“no”:null,“value”:[3.523422,0,-323123123,3.4239223372036854775807,0,“test 123.32”,“0,0”,“0,0]};
常量subst=`$1`;
const result=str.replace(regex,subst);

console.log(result);
您可以循环浏览数据并将其转换为字符串,如下所示:

var data={“status”:“ok”,“data”:{“grpd”:0,“obj”:073741824,“objInst”:0,“no”:null,“value”:[3.523422,0,-323123123,3.4239223372036854775807,0,“test 123.32”,“0,0”,“0,0]}
var值=[];
对于(变量i=0;ilog(数据);
您只需使用一个循环来检查值是否为数字或浮点值,并将其转换为字符串

var obj1={“状态”:“正常”,“数据”:{“grpd”:0,“obj”:073741824,“objInst”:0,“否”:null,“值”:[3.523422,0,-323123123,3.4239223372036854775807,0,“测试123.32”,“0,0”,“0,0]};
obj1.data.values.forEach(函数(值、索引、数组){
如果(!isNaN(value)| value.toString().indexOf('.')!=-1)
{
数组[索引]=value.toString();
}
});
console.log(obj1);
还是es5

obj.values = obj.values.map(function(item) {
  return typeof item === 'number' ? '"'+item+'"';
}

或者,您可以使用!isNaN(item)

代替typeof item==='number',如果您确实无法将原始JSON更改为使用不在JS支持范围内的数字字符串,则可以使用类似以下内容:

var json='{“status”:“ok”,“data”:{“grpd”:0,“obj”:073741824,“objInst”:0,“no”:null,“value”:[3.523422,0,-323123123,3.4239223372036854775807,0,“test 123.32”,“0,0”,“0,0”,“test\\u0022 123”,“test\\\\“123”};
var inString=false;
var inNumber=假;
var out='';
for(var index=0,len=json.length;indexconsole.log(注销);
使用JSON解析器。如果我能对此进行十几次注释,我会这样做。您可能会一直使用正则表达式,但我认为正则表达式不应该是这里的主要解决方案。但为什么要将数字转换为字符串呢?如果我学到了一件事,那就是让基元类型保留其本机类型。很可能您采取了错误的方法,并且没有任何错误ed将数字转换为字符串。因为它们是数字…我转换它们是因为我需要处理大数字,而JS不支持大数字,我只需要获取这些值并将它们放在页面上。大数字是:9223372036854775807。尝试将其像数字一样放在控制台上。如果有更好的方法可以这样做,我很乐意为您提供帮助使用它,但我不知道。所以我将它们转换为字符串,然后用JSON解析器对其进行解析。如何生成此JSON?为什么不将
obj.data.values
a
string[]
在构建这个JSON之前/什么时候?当你只想把这些数字放在页面上时,这些数字是数字而不是字符串真的有问题吗,正如你所说的那样?这么多问题,为了避免这个问题,我正在转换它们,因为我需要处理JS不支持的大数字,我只需要获取这些值并将它们放在em在页面上。最大的数字是:9223372036854775807。试着把它像数字一样放在你的控制台上。如果有更好的方法,我会很乐意使用它,但我不知道。所以我将它们转换为字符串,然后用JSON解析器解析。@MilenGrigorov我现在知道了,解析为JSON/数字的方法将不起作用。现在效果很好,th谢谢你,但我已经接受了Rizwan Tuman的答案;“我丢失了大数字,因为JS不支持它们。无论如何,谢谢,上面的一些人给了我好的正则表达式。谢谢你的回答,但是使用这种方法会丢失大数字。Javascript不支持大数字,因为它们会截断它们,所以为了保留它们,你需要从服务器本身将它们作为字符串发送。是的,我知道,这就是为什么我问了这个问题。但我不能更改服务器,这是特定设备上的服务器,不能这样更改。我不相信这对原始测试数据中的
“test 123.32”
示例有效。如果我有“adsa22”,只需再问一个问题,“它也会匹配2,我怎么能逃脱他们的匹配呢?”米伦格里戈罗夫这样说
let obj = JSON.parse(response);
obj.values = obj.values.map(item => typeof item === 'number' ? '"'+item+'"');
console.log(JSON.stringify(obj));
obj.values = obj.values.map(function(item) {
  return typeof item === 'number' ? '"'+item+'"';
}