如何使用正则表达式验证内容类型?

时间:2019-04-26 12:56:22

标签: regex

我需要使用正则表达式(python)验证请求Accept标头。正则表达式必须匹配application / json或application / jose + jwe和其他参数(charset = utf8和q值)。

最初只接受application / json和q值,没有其他mimi类型的要求。我有以下有效的正则表达式。

(^application/json;q=(0|1|(0\.[1-9]))$)|(^application/json$)

我知道需要将字符集参数包含到charset=utf8中,并能够匹配行中的任何地方。

我是regex的新手,并创建了以下regex,但它不符合所有要求(https://regex101.com/r/vFMCcI/11)-

(application/json; q=(0|1|(0\.[1-9])))$|(application\/json; charset=utf8)|(application\/json; charset=utf8 q=(0|1|(0\.[1-9])))|(application/json)

测试字符串是

application/json,
application/json; q=0.2
application/json; charset=utf8
application/json; q=0.2 charset=utf8
application/json; charset=utf8 q=0.2
text/html, application/json; q=0.2, application/pdf

application/jose+jwe
application/jose+jwe; q=0.2
application/jose+jwe; charset=utf8
application/jose+jwe; q=0.2 charset=utf8
application/jose+jwe; charset=utf8 q=0.2
text/html, application/jose+jwe; q=0.2, application/pdf
  1. 为什么我只得到application/json; charset=utf8 q=0.2的部分匹配?
  2. 当甚至不包含application / jose + jwe时,正则表达式变得太长。它在请求上增加了ms。关于此的任何指针都可以更好地优化?

编辑:

Q值必须为0-1,并且只能保留到小数点后一位

0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1

唯一可接受的字符集值为charset=utf8

谢谢

2 个答案:

答案 0 :(得分:2)

这是更具体的模式。

^application\/(json|jose\+jwe)(;(( q=(1|0\.\d))|( charset.utf8))+)?$

这将与您上面描述的相符。在第一个测试用例中,有一个逗号结尾,但是我不确定您是否要包括它。不过,这是一个简单的添加。

^application\/(json|jose\+jwe)(;(( q=(1|0\.\d))|( charset.utf8))+)?,?$

答案 1 :(得分:1)

尝试此正则表达式。它与可选的“ q”和可选的“字符集”一起使用

application\/(json|jose\+jwe)(;\s)?((charset=utf8|q=[0-1]\.\d)(\s)?)*

https://regex101.com/r/ABjXH4/5