2016-07-21 66 views
1

我有一个JSON缺失报价java的正则表达式匹配单词不是数字

{ 
    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

正则表达式可以完成这项工作,但我必须问,为什么?正则表达式可能非常昂贵。它看起来像你正试图注入正确的格式到你的JSON字符串中,但为什么不是格式正确的第一个地方? – Bryan

+0

其缺失的引号,我需要处理的数字而不是字符串,我可能只是把所有的单词引号,并使用Integer.parseInt() – gary69

+0

我的意思是为什么字符串没有引号已经?你有任何控制字符串是如何格式化的?如果是这样,为什么不使用库[Gson](https://github.com/google/gson)为您生成格式正确的字符串? – Bryan

回答

1

你可以试试这个前瞻的正则表达式:

str = str.replaceAll("[\\w-]+(?=\\s*:)", "\"$0\"") 
     .replceAll("(?<=:)\\s*(?!-?\\d+(?:\\.\\d+)?\\s*(?:,|\\r?\\n))([\\w-]+)", "\"$1\""); 

RegEx Demo

(?!-?\\d+(?:\\.\\d+)?\\s*(?:,|\\r?\\n))是否定的前瞻断言我们不匹配负数/正数十进制/整数。

+0

谢谢,但只能在包含字母和数字的单词附加引号。我会玩它 – gary69

+0

如果你能显示你的预期输出从上面的例子,那么我可以看看这个 – anubhava

+0

所以你想引用的名字,而不仅仅是价值观? – anubhava

2

您应该使用负先行的“不是一个数字”

((?![-+]?[0-9]*\\.?[0-9])\\w+\\b) 

\"$0\"更换

编辑: JimmyJames解决方案可能是快,但仍然需要负先行处理空和布尔值 - 处理整个json。

\b(?!null|true|false)(\w|\.)*([a-z]|[A-Z])+(\w|\.)\b 
0

假设一个字的字(或期间)与至少一个字母字符的连续序列,那岂不是我更有效的为您的比赛做这样的事情?

(\w|\.)*([a-z]|[A-Z])+(\w|\.) 

与之相对找出所有单词,然后排除号码?

相关问题