正则表达式匹配 JWT

Gra*_*pet 11 regex

我没有正则表达式的经验,我请求你的帮助。

我需要一个正则表达式来捕获以下字符串中的 JWT:

"contextJwt": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJIZWxsbyB5b3UiLCJuYW1lIjoiV2h5IGFyZSB5b3UgY2hlY2tpbmcgbXkgdG9rZW4_ICggzaHCsCDNnMqWIM2hwrApIiwiaWF0IjoxNTE2MjM5MDIyfQ.yAP0xiTwp6vqIYbLKLVBRv-gTyMvU17rT3H8uErLjHA"

请求答案(2363 行)

谢谢你的时间

Ale*_*x_P 25

我创建了一个正则表达式,它可能不是最优雅的,但它似乎有效。

(^[A-Za-z0-9-_]*\.[A-Za-z0-9-_]*\.[A-Za-z0-9-_]*$)
Run Code Online (Sandbox Code Playgroud)

更简洁的版本也可以是:

(^[\w-]*\.[\w-]*\.[\w-]*$)
Run Code Online (Sandbox Code Playgroud)

但是,我相信非拉丁字符也是允许的,而 JWT 是不允许的。

  • 最好使用“+”(1..n),而不是“*”(0..n),否则诸如“..”之类的字符串也会匹配。 (14认同)
  • 这是一个清理版本 `/^(?:[\w-]*\.){2}[\w-]*$/` 和一个测试器,以防有人想尝试非拉丁字符之类的东西:https ://regex101.com/r/0OsWPw/1 (6认同)
  • @Buffoonism 字符类是从左到右解析的,因此 `0-9` 将优先于 `9-_`,因此不需要将连字符放在最后(尽管通常来说避免视觉歧义仍然是一个好主意) (2认同)

Eve*_*ett 3

如果您将 HTML 文档作为字符串使用,并且使用 Javascript 来运行正则表达式,则可以执行如下操作:

const html = '<div>stuff</div>something "contextJwt": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJIZWxsbyB5b3UiLCJuYW1lIjoiV2h5IGFyZSB5b3UgY2hlY2tpbmcgbXkgdG9rZW4_ICggzaHCsCDNnMqWIM2hwrApIiwiaWF0IjoxNTE2MjM5MDIyfQ.yAP0xiTwp6vqIYbLKLVBRv-gTyMvU17rT3H8uErLjHA" <div> other stuff</div>';
var regex = /"contextJwt":\s*"(.*)"/;
console.log(html.match(regex)[1]);

/* yields the encoded JWT string:
 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJIZWxsbyB5b3UiLCJuYW1lIjoiV2h5IGFyZSB5b3UgY2hlY2tpbmcgbXkgdG9rZW4_ICggzaHCsCDNnMqWIM2hwrApIiwiaWF0IjoxNTE2MjM5MDIyfQ.yAP0xiTwp6vqIYbLKLVBRv-gTyMvU17rT3H8uErLjHA

*/
Run Code Online (Sandbox Code Playgroud)

您可以将匹配从简单的字符加强(.*)到有效编码 JWT 中允许的特定字符(根据 Helio Santo 的答案),但由于正则表达式很挑剔,我通常从最简单的解决方案开始,只在必要时收紧它。

您如何处理表示编码 JWT 的字符串可能完全是另一个问题。