簡體   English   中英

JavaScript正則表達式匹配數組中的數字

[英]JavaScript regex to match numbers in array

我有以下文字:

 {"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"]}}

數字可以是浮點數,負數和正常數。

如果你真的需要通過正則表達式來做,那么你可以試試這個。

 const regex = /(-?\\d+(\\.\\d+)?)(?![^,]*")/g; const str = `{"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]}}`; const subst = `"$1"`; const result = str.replace(regex, subst); console.log(result); 

正則表達式演示

根據評論更新:

(\:\s*|,|\[|\{)\s*(-?\d+(?:\.\d+)?)(?=[,\]\}])

演示2

 const regex = /(\\:\\s*|,|\\[|\\{)\\s*(-?\\d+(?:\\.\\d+)?)(?=[,\\]\\}])/g; const str = `{"status": "ok","data": {"grpd": 0,"obj": 073741824,"objInst": 0,"no": null,"values": [3.523422,0,-323123123,3.423,"test 123.3,2",0,"test 123.32",0,0,"","adsa22s22",0]}}`; const subst = `$1"$2"`; const result = str.replace(regex, subst); console.log(result); 

您可以遍歷數據並將其轉換為字符串,如下所示:

 var data = {"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]}} var values = []; for (var i = 0 ; i < data.data.values.length ; i ++) { values.push(String(data.data.values[i])); } data.data.values = values; console.log(data); 

你只需要一個循環來檢查值是一個數字或浮點值並轉換為字符串。

 var obj1 = {"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]}}; obj1.data.values.forEach(function(value, index, theArray) { if (!isNaN(value) || value.toString().indexOf('.') != -1) { theArray[index] = value.toString(); } }); console.log(obj1); 

首先將它們解析為JS對象

var obj = JSON.parse( jsonString );

然后

obj.data.values = obj.data.values.map( function( item ){ return !isNaN( item ) ? String( item ) : item; });

將其轉換回JSON字符串格式

jsonString  = JSON.stringify( obj );

但是,如果數字超出javascript對象可以采用的數字,那么使用這個基於正則表達式的解決方案

 var str = '{"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]}}'; str = str.replace(/[,|\\[](\\-){0,1}\\d+(\\.\\d+)*(?=[,|\\]])/g, function(match){ var firstChar = match.charAt(0); match = match.substring( 1 ); return firstChar + "\\"" + match + "\\"" ; }); console.log( str ); 

let obj = JSON.parse(response);
obj.values = obj.values.map(item => typeof item === 'number' ? '"'+item+'"');
console.log(JSON.stringify(obj));

或與es5

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

或者代替typeof item ==='number'你可以使用! isNaN(項目)

如果您真的無法更改原始JSON以將字符串用於不在JS支持的范圍內的數字,那么您可以使用以下內容:

 var json = '{"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, "test \\" 123", "test \\\\" 123"]}}'; var inString = false; var inNumber = false; var out = ''; for (var index = 0, len = json.length ; index < len ; ++index) { var chr = json.charAt(index); switch (chr) { case '"': inString = !inString; break; case '\\\\': out += chr + json.charAt(index + 1); ++index; continue; case '-': case '.': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (!inString && !inNumber) { out += '"'; inNumber = true; } break; default: if (inNumber) { inNumber = false; out += '"'; } } out += chr; } console.log(out); 

使用RegExp處理字符串中的數字太棘手,所以我甚至沒有嘗試過。 我假設JSON是有效的......如果不是,我的粗解析器將無法很好地應對。 我也忽略了數字的7e5表示法,這需要一些額外的工作來避免匹配truee

我沒有明確地針對數組values但可以相應地進行調整。 你究竟是如何做到這一點取決於你是否想要處理通用的JSON或者更符合你的確切格式的東西。 例如,一旦達到某個長度,您可能只會在數字周圍加上引號。 通過跟蹤數字開始的確切索引而不僅僅是使用isNumber標志,可以很容易地添加。

如果我打算在生產中使用這樣的東西,我會寫一些大量的單元測試,以確保它確實有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM