2016-07-21 9 views
1

Ich habe eine json fehlt ZitateJava Regex Wörter, die Zahlen sind nicht

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

Ich brauche Anführungszeichen links von Kolon und allen Wörtern um all die Worte zu fassen, die nicht reine Zahlen rechts vom Doppelpunkt. Also brauche ich Zitate um A1000049A6248C aber nicht -1.974655. Wie mache ich eine Regex, um dies in Java zu tun? Ich habe versucht,

json.replaceAll("(\\w+|[+-]([0-9]*[.])?[0-9]+)", "\"$1\"");

, die jedes Wort in Anführungszeichen gesetzt werden. Ich habe auch versucht, so etwas wie dieses Wort zu erhalten, die nicht alle Zahlen json.replaceAll("\\b(?!\\d*)\\b", "\"$1\"");

Erwartetes Format kann

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

Ein regulärer Ausdruck könnte den Job erledigen, aber ich muss fragen, warum? Reguläre Ausdrücke können sehr teuer sein. Es sieht so aus, als ob Sie versuchen, die korrekte Formatierung in Ihre JSON-Zeichenfolge zu injizieren, aber warum ist sie nicht richtig formatiert? – Bryan

+0

Seine fehlenden Anführungszeichen, und ich muss mit den Zahlen als Zahlen und nicht als Strings umgehen, werde ich wahrscheinlich nur Zitate um alle Wörter setzen und Integer.parseInt() verwenden – gary69

+0

Ich meinte, warum nicht die Strings Zitate haben bereits? Haben Sie eine Kontrolle darüber, wie der String formatiert wird? Wenn ja, warum nicht eine Bibliothek wie [Gson] (https://github.com/google/gson) verwenden, um eine korrekt formatierte Zeichenfolge für Sie zu generieren? – Bryan

Antwort

1

Sie diesen Look-Ahead-regex versuchen ist:

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

RegEx Demo

(?!-?\\d+(?:\\.\\d+)?\\s*(?:,|\\r?\\n)) ist der negative Lookahead zu behaupten, dass wir nicht übereinstimmen eine negative/positive Dezimal/Ganzzahl.

+0

Danke, aber das nur Zitate um Wörter, die sowohl Buchstaben als auch Zahlen enthalten. Ich werde damit herumspielen – gary69

+0

Wenn Sie Ihre erwartete Ausgabe von oben Beispiel zeigen können, dann kann ich in diese – anubhava

+0

schauen Sie wollen also Namen und nicht nur die Werte zitieren? – anubhava

2

Sie sollten negative Vorschau verwenden für 'nicht eine Zahl'

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

mit \"$0\" Ersatz

Edit: JimmyJames Lösung wahrscheinlich schneller ist, aber immer noch negative Vorschau müssen null und boolean zu handhaben Werte - um den gesamten json zu behandeln.

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

Unter der Annahme, ein Wort ist eine kontinuierliche Folge von Wort (oder Periode) Zeichen mit mindestens einem Brief, Wäre es nicht ich effizienter so etwas für Ihr Spiel zu tun?

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

Im Gegensatz zu allen Wörtern finden und dann die Zahlen ausschließen?

Verwandte Themen