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