java正则表达式匹配不是数字的单词

时间:2016-07-21 19:34:36

标签: java regex

我有一个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
  }
}

3 个答案:

答案 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\"");

RegEx Demo

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

答案 2 :(得分:0)

假设一个单词是一个连续的单词(或句点)字符序列,至少有一个字母,那么为你的比赛做这样的事情会更有效吗?

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

与找到所有单词然后排除数字相反?