Вычитание веб-токена JSON (JWT) с помощью регулярного выражения

#regex #string #jwt

#регулярное выражение #строка #jwt

Вопрос:

Я пытаюсь вычесть значение для JWT и значение для hashid среды из длинной строки, которая имеет этот аналогичный формат.

{«user»:{«hashId»: «c45pq0″,»email»:»info@whatever.com «, «имя»: «Джон Доу», «компания»: null, «права»: [«СТАТИЧЕСКИЕ», «ПОЛЬЗОВАТЕЛИ»]}, «jwt»:» eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpcCI6InJvYkB3aXRodGhlZ3JpZC5jb20iLCJpA9qiOjE1Nzc3MTA5NjksImV4cCI6MTU4MDMwMjk2OSwiaXNzIjoid2l0aHRoZWdyaWQifQ.7PbwwsWU7x63Pd-J_KZQL22r185GfiufixyXQGOyQs8 «, «environment»:{«hashId»:»abcd123«, «name»: «Doe»}, «environmentRights»: [«STATIC»,»USERS»]}

Меня интересуют значения, выделенные жирным шрифтом. Это может быть два выражения или одно.

Я пробовал это, чтобы изолировать JWT, но это не работает. bjwt b, $ В принципе, я хочу строку, которая начинается с jwt и заканчивается следующей запятой после jwt. Но это не работает.

И я определенно не знаю, как изолировать значение hashid среды, учитывая, что в строке более одного значения hashid.

Комментарии:

1. Что вы подразумеваете под » вычитанием «? Вы хотите извлечь значение или удалить эти свойства из JSON? В любом случае вам не следует использовать регулярное выражение для этого. С каким языком программирования вы работаете?

2. Я использую FME, приложение с низким уровнем кода / без кода, которое имеет возможность использовать регулярные выражения для обработки текста. Вот почему моей первоначальной мыслью было использовать regex. Он также имеет возможность реализовывать скрипты на Python, поэтому я тоже попробую это.

Ответ №1:

Это не решение для регулярных выражений (решение для регулярных выражений приведено ниже):

Строка кажется допустимой JSON (вот почему она называется веб-токеном JSON). Проанализируйте его как JSON , используя язык по вашему выбору. Затем должно быть просто извлечь все, что вы хотите. Например, в Python:

 import json

s = '{"user":{"hashId":"c45pq0","email":"info@whatever.com","name": "John Doe","company": null,"rights":[ "STATIC","USERS"]},"jwt":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpcCI6InJvYkB3aXRodGhlZ3JpZC5jb20iLCJpA9qiOjE1Nzc3MTA5NjksImV4cCI6MTU4MDMwMjk2OSwiaXNzIjoid2l0aHRoZWdyaWQifQ.7PbwwsWU7x63Pd-J_KZQL22r185GfiufixyXQGOyQs8","environment":{"hashId":"abcd123","name":"Doe"},"environmentRights": ["STATIC","USERS"]}'

d = json.loads(s)
print(d['jwt'])
print(d['environment']['hashId'])
  

С принтами:

 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpcCI6InJvYkB3aXRodGhlZ3JpZC5jb20iLCJpA9qiOjE1Nzc3MTA5NjksImV4cCI6MTU4MDMwMjk2OSwiaXNzIjoid2l0aHRoZWdyaWQifQ.7PbwwsWU7x63Pd-J_KZQL22r185GfiufixyXQGOyQs8
abcd123
  

В JavaScript:

 const s = '{"user":{"hashId":"c45pq0","email":"info@whatever.com","name": "John Doe","company": null,"rights":[ "STATIC","USERS"]},"jwt":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpcCI6InJvYkB3aXRodGhlZ3JpZC5jb20iLCJpA9qiOjE1Nzc3MTA5NjksImV4cCI6MTU4MDMwMjk2OSwiaXNzIjoid2l0aHRoZWdyaWQifQ.7PbwwsWU7x63Pd-J_KZQL22r185GfiufixyXQGOyQs8","environment":{"hashId":"abcd123","name":"Doe"},"environmentRights": ["STATIC","USERS"]}'
const d = JSON.parse(s);
console.log(d.jwt);
console.log(d.environment.hashId);  

Решение для регулярных выражений

Это регулярное выражение может быть немного «излишним», когда я не предполагаю, что " не может отображаться в полях jwt или hashId (конечно, правильно экранированных). Некоторые исследования с моей стороны могли бы ответить на этот вопрос, но …

 "jwt":s*"((?:(?!(?<!\)").)*)".*?"hashId":s*"((?:(?!(?<!\)").)*)"
  
  1. "jwt":s*" Соответствует «jwt»: за которым следует 0 или более символов пробела, за которыми следует «.
  2. ((?:(?!(?<!\)").)*) Соответствует 0 или более символам, если они не являются » символом, которому не предшествует обратная косая черта, и накапливает эти символы в группе захвата 1.
  3. " совпадает «.
  4. .*? Не жадно сопоставляет 0 или более символов, отличных от новой строки, до …
  5. "hashId":s*" Соответствует «hashId»: за которым следует 0 или более символов пробела, за которыми следует «.
  6. ((?:(?!(?<!\)").)*) Соответствует 0 или более символам, если они не являются » символом, которому не предшествует обратная косая черта, и накапливает эти символы в группе захвата 2.
  7. " совпадает «.

Нужные значения находятся в группах захвата 1 и 2.

Демонстрация регулярных выражений

 import re

s = '{"user":{"hashId":"c45pq0","email":"info@whatever.com","name": "John Doe","company": null,"rights":[ "STATIC","USERS"]},"jwt":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpcCI6InJvYkB3aXRodGhlZ3JpZC5jb20iLCJpA9qiOjE1Nzc3MTA5NjksImV4cCI6MTU4MDMwMjk2OSwiaXNzIjoid2l0aHRoZWdyaWQifQ.7PbwwsWU7x63Pd-J_KZQL22r185GfiufixyXQGOyQs8","environment":{"hashId":"abcd123","name":"Doe"},"environmentRights": ["STATIC","USERS"]}'

m = re.search(r'"jwt":s*"((?:(?!(?<!\)").)*)".*?"hashId":s*"((?:(?!(?<!\)").)*)"', s)
if m:
    print(m[1])
    print(m[2])
  

С принтами:

 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpcCI6InJvYkB3aXRodGhlZ3JpZC5jb20iLCJpA9qiOjE1Nzc3MTA5NjksImV4cCI6MTU4MDMwMjk2OSwiaXNzIjoid2l0aHRoZWdyaWQifQ.7PbwwsWU7x63Pd-J_KZQL22r185GfiufixyXQGOyQs8
abcd123