2016-07-21 61 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|\.) 

與之相對找出所有單詞,然後排除號碼?

相關問題