我有一个json缺少引号
{
data: [{
timestamp: 1467720920,
val: {
min: 6.90,
max: 7.25,
avg: 7.22
},
temp: {
min: 75.49,
max: 75.49,
avg: 75.49
},
gps: {
lat: 0.707581,
long: -1.941864,
hdop: 2.54,
ttf: 49.4
}
}],
id: A1000049A6248C,
groupId: HU5PPC1E,
rssi: -93,
cell: {
timestamp: 1467731669,
rssi: -93,
lat: 0.735554,
long: -1.974655
}
}
}
我需要在冒号左侧的所有单词周围加上引号,并且所有单词都不是冒号右侧的纯数字。所以我需要A1000049A6248C周围的报价但不是-1.974655。如何在java中创建正则表达式? 我试过了
json.replaceAll("(\\w+|[+-]([0-9]*[.])?[0-9]+)", "\"$1\"");
将每个单词都放在引号中。我也试过这样的话来得到一个不是所有数字的单词json.replaceAll("\\b(?!\\d*)\\b", "\"$1\"");
预期格式
{
"data": [
{
"timestamp": 1463494202,
"val": {
"min": 6.75,
"max": 7.19,
"avg": 7.14
},
"temp_int": {
"min": 54.28,
"max": 54.28,
"avg": 54.28
},
"gps": {
"lat": 0.711407,
"long": -1.460091,
"hdop": 1.42,
"ttf": 42
}
}
],
"id": "A1000049A624D1",
"groupId": "299F7G5AR",
"rssi": -83,
"cell": {
"timestamp": 1463501353,
"rssi": -83,
"lat": 0,
"long": 0
}
}
答案 0 :(得分:2)
你应该对'不是数字'
使用否定前瞻((?![-+]?[0-9]*\\.?[0-9])\\w+\\b)
与
\"$0\"
替换
修改强> JimmyJames解决方案可能更快,但仍然需要负面预测来处理null和布尔值 - 处理整个json。
\b(?!null|true|false)(\w|\.)*([a-z]|[A-Z])+(\w|\.)\b
答案 1 :(得分:1)
你可以试试这个前瞻性的正则表达式:
str = str.replaceAll("[\\w-]+(?=\\s*:)", "\"$0\"")
.replceAll("(?<=:)\\s*(?!-?\\d+(?:\\.\\d+)?\\s*(?:,|\\r?\\n))([\\w-]+)", "\"$1\"");
(?!-?\\d+(?:\\.\\d+)?\\s*(?:,|\\r?\\n))
是否定的断言,断言我们不匹配负/正十进制/整数。
答案 2 :(得分:0)
假设一个单词是一个连续的单词(或句点)字符序列,至少有一个字母,那么为你的比赛做这样的事情会更有效吗?
(\w|\.)*([a-z]|[A-Z])+(\w|\.)
与找到所有单词然后排除数字相反?