【问题标题】:Substracting JSON Web Token (JWT) with regular expression用正则表达式减去 JSON Web Token (JWT)
【发布时间】:2020-12-21 13:07:53
【问题描述】:

我正在尝试从具有这种类似格式的长字符串中减去 JWT 的值和环境 hashid 的值。

{"user":{"hashId":"c45pq0","email":"info@whatever.com","name":"John Doe","company": null,"rights":["静态”, “USERS”]} “JWT”: “的 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpcCI6InJvYkB3aXRodGhlZ3JpZC5jb20iLCJpA9qiOjE1Nzc3MTA5NjksImV4cCI6MTU4MDMwMjk2OSwiaXNzIjoid2l0aHRoZWdyaWQifQ.7PbwwsWU7x63Pd-J_KZQL22r185GfiufixyXQGOyQs8 强>”, “环境”:{ “hashId”: “的 abcd123 强>”, "name":"Doe"},"environmentRights": ["STATIC","USERS"]}

我对粗体值感兴趣。可以是两个表达式,也可以是一个。

我已经尝试这样做来隔离 JWT,但这不起作用。 \bjwt\b,$ 基本上我想要以 jwt 开头的字符串,并以 jwt 之后的下一个逗号结尾。但它不起作用。

而且我绝对不知道如何隔离环境 hashid 值,考虑到字符串中有多个 hashid 值。

【问题讨论】:

  • 减法”是什么意思?您想提取 值,还是删除 JSON 中的那些属性?在任何一种情况下,您都不应该为此使用正则表达式。您使用什么编程语言?
  • 我正在使用 FME,这是一个低代码/无代码应用程序,它能够使用正则表达式来处理文本。这就是为什么我最初的想法是使用正则表达式。它还具有实现 Python 脚本的能力,所以我也会尝试一下。

标签: regex string jwt


【解决方案1】:

不是正则表达式解决方案(正则表达式解决方案如下):

字符串似乎是有效的JSON(这就是它被称为 JSON Web 令牌的原因)。使用您选择的语言将其解析为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);

正则表达式解决方案

这个正则表达式可能有点“矫枉过正”,我不认为" 不能出现在jwthashId 字段中(当然,正确转义)。我的一些研究可以回答这个问题,但是......

"jwt":\s*"((?:(?!(?<!\\)").)*)".*?"hashId":\s*"((?:(?!(?<!\\)").)*)"
  1. "jwt":\s*" 匹配“jwt”:后跟 0 个或多个空格字符,后跟“。
  2. ((?:(?!(?&lt;!\\)").)*) 匹配 0 个或多个字符,只要它们不是前面没有反斜杠的 " 字符,并将这些字符累积到捕获组 1 中。
  3. " 匹配“。
  4. .*? 非贪婪匹配 0 个或多个非换行符,直到 ...
  5. "hashId":\s*" 匹配“hashId”:后跟 0 个或多个空格字符,后跟“.
  6. ((?:(?!(?&lt;!\\)").)*) 匹配 0 个或多个字符,只要它们不是前面没有反斜杠的 " 字符,并将这些字符累积到捕获组 2 中。
  7. " 匹配“。

您想要的值在捕获组 1 和 2 中。

Regex Demo

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-21
    • 2019-10-25
    • 2019-06-22
    • 1970-01-01
    • 2016-06-18
    • 1970-01-01
    • 2023-04-05
    相关资源
    最近更新 更多