Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何使用正则表达式验证内容类型?_Regex - Fatal编程技术网

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

Regex 如何使用正则表达式验证内容类型?,regex,Regex,我需要使用正则表达式(python)验证请求接受头。正则表达式必须匹配application/json或application/jose+jwe和其他参数(charset=utf8和q值) 最初要求只接受application/json和q值,而不接受其他mimi类型。我用了下面的正则表达式 (^application/json;q=(0 | 1 |(0\[1-9]))|(^application/json$) 我知道需要能够将字符集参数包含到charset=utf8中,并且能够匹配行中的任何位

我需要使用正则表达式(python)验证请求接受头。正则表达式必须匹配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,但它不符合所有要求()-

(application/json;q=(0\[1-9]))$(application\/json;charset=utf8)|(application\/json;charset=utf8 q=(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
  • 为什么我只能得到
    application/json的部分匹配;字符集=utf8 q=0.2
  • 当application/jose+jwe甚至没有包括在内时,正则表达式变得太长了。它将ms添加到请求中。这方面的任何指标都可以得到更好的优化
  • 编辑:

    Q值必须为0-1且仅保留小数点后1位

    0
    0.1
    0.2
    0.3
    0.4
    0.5
    0.6
    0.7
    0.8
    0.9
    1
    
    唯一可接受的字符集值是
    charset=utf8


    谢谢

    试试这个正则表达式。它与可选的“q”和可选的“charset”一起工作


    这里有一个更具体的模式

    ^application\/(json|jose\+jwe)(;(( q=(1|0\.\d))|( charset.utf8))+)?$
    
    这将符合您上面描述的内容。在第一个测试用例中,后面有一个逗号,但我不确定是否要包含它。不过这是一个简单的添加

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

    这比我的正则表达式好多了。我应该说得更清楚些只允许
    charset=utf8
    。您的正则表达式接受字符集之后的任何内容。-它与我不需要的
    application/pdf
    匹配。我相信这是因为q?-q值只能是整数。我在某个地方读到它只有1个小数点。好的,我改变了一些事情,再看看正则表达式和链接。对不起,我的解释不清楚和准确。我已经更新了问题。q值必须介于0-1(小数点后1位)之间,并且唯一可接受的字符集值是
    charset=utf8
    。此外,如果包含参数,则它们必须有效。如果您查看更新请求()中的底线,
    application/jose+jwe;行话
    应该是失败的请求。这是我感到困惑的地方,我已经建立了另一个可选步骤,应该可以工作。这很好,离我一直试图实现的目标更近了。我确实需要后面的逗号,因为它可能会在提交其他MIME类型时使用-
    ^application\/(json | jose\+jwe)(;((q=(1 | 0\.\d))|(charset.utf8))+)?,?$
    。唯一的问题是,当MIME类型不是以application/json开头时(在两个MIME类型之间或结尾),它与MIME类型不匹配。例如,
    text/html、application/json失败;q=0.2,application/pdf
    text/html,application/json;q=0.2,
    Update-这允许在
    application\/(json | jose\+jwe)(;((q=(1 | 0\.\d))|(charset.utf8))+),?
    行中的任何地方进行匹配,但是它知道匹配
    application/jsonjargon
    ,这应该是失败的匹配…它匹配行中的任何地方,尽管-
    application\/(json | jose\+jwe)(;(q=(1 | 0.\d))(charset=utf8))+)?,?
    虽然它现在正在匹配,但如果在匹配后包含其他字符,即application/json,它将不正确地匹配;字符集=utf8 q=0.1行话。
    ^application\/(json|jose\+jwe)(;(( q=(1|0\.\d))|( charset.utf8))+)?,?$