Mam sformatowany sznurek JSON, który próbuję przeanalizować za pomocą regexa. Chciałbym przeanalizować każdą parę wartości kluczowej do późniejszego użycia w Grafanie (sam REGEX jest używany w Logstyl).

Ciąg testowy wygląda tak:

{
  "version":"1.1",
  "nameId":"test",
  "productId":"B2",
  "total customers":99,
  "full_description":"asdf"
}

Używam następującego wyrażenia regexa, ale wydaje się, że jeśli wartość jest liczbą (bez ""), grupuje przecinek o wartości. Na przykład wartość grupy dla kluczy "Łącznych klientów" jest "99", a nie tylko "99".

(?i)["'](?<key>[^"]*)["'](?:\:)["'\{\[]?([\r\n]?\t+\")?(?<value>\w(?:\s[a-zA-Z0-9_=]\.?)+\w+@(?:(?:\w[a-z\d\-]+\w)\.)+[a-z]{2,10}|true|false|[\w+-.$\s=-]*)(",[\r\n])?(?2)?(?J)(?<value>(?&value))?

Co muszę dodać do wyrażenia regexa, aby analizować wartości JSON, które są liczbami?

1
user7335295 13 kwiecień 2021, 08:51

1 odpowiedź

Najlepsza odpowiedź

Ta część w wzorze [\w+-.$\s=-] ma zasięg +-. zamiast dopasowywać albo + - lub .

Range Matches ASCII Chars Decimals Number 43-46, gdzie numer 44 pasuje do niechcianej ,

Jako klasa znaków jest już pasuje do - na końcu, dzięki czemu można pominąć środkowy -.

Wzór zawiera pewne zbędne grupy ucieczki i wychwytywanie i wydaje się nieco skomplikowane. Zaktualizowany wzór z zaledwie 2 grup przechwytywania może wyglądać;

(?i)["'](?<key>[^"]*)["']:["'{\[]?(?:[\r\n]?\t+")?(?<value>\w(?:\s[a-zA-Z\d_=]\.?)+\w+@(?:\w[a-z\d-]+\w\.)+[a-z]{2,10}|true|false|[\w+.$\s=-]*)(?:",[\r\n])?(?2)?(?J)(?<value>(?&value))?

Demo Regex

0
The fourth bird 13 kwiecień 2021, 17:11