Regex 正则表达式不允许在包含捕获组的字符串中的任何位置使用字符
使用Accept,我创建了以下正则表达式字符串以验证标头的值: ^[^\/]+[\/][^\/;,]+;q[]*=[]*[0-9][.][0-9]?[,][]*+$ 虽然这适用于有效标题输入的不同示例,例如单个输入:text/html、application/xhtml+xml、application/xml;q=0.9,图像/webp,*/*;q=0.8,头是CORS安全列表请求头,这意味着头有一个附加限制:有一组字符不能在值中::?@[\]{},0x00-0x1f,0x09,0x7f除外 因此,我试图通过在正则表达式字符串的开头或结尾添加[^:]*来禁止:而没有任何效果。这个语法正确吗?如果正确,我需要把它放在哪里才能应用于整个字符串Regex 正则表达式不允许在包含捕获组的字符串中的任何位置使用字符,regex,Regex,使用Accept,我创建了以下正则表达式字符串以验证标头的值: ^[^\/]+[\/][^\/;,]+;q[]*=[]*[0-9][.][0-9]?[,][]*+$ 虽然这适用于有效标题输入的不同示例,例如单个输入:text/html、application/xhtml+xml、application/xml;q=0.9,图像/webp,*/*;q=0.8,头是CORS安全列表请求头,这意味着头有一个附加限制:有一组字符不能在值中::?@[\]{},0x00-0x1f,0x09,0x7f除外 因
如果正则表达式字符串仅为^[^:::]*$,则它不允许:字符串中的任何位置,因此我不确定对于标头示例,它是否因捕获组而不起作用?我对正则表达式没有太多的经验。我将在Python3.9中实现正则表达式。您可以在正则表达式的开头进行负面展望: *[:?@\[\\]{}、\x00-\x08\x0a-\x1f\x7f]基于RFC-7231 at,除q=0.7外,每种媒体类型还接受可选的key=value参数。下面是一个更全面的测试用例,涵盖了这一点:
text/*, text/plain, text/plain;format=flowed, text/html;level=1, text/html;level=2;q=0.4, application/xhtml+xml, application/xml;q=0.9, image/webp, */*;q=0.1
此正则表达式测试接受值的RFC符合性:
多行相同,可读性不是有效的正则表达式:
/^(?!.*[():<>?@\[\\\]{}\x00-\x08\x0a-\x1f\x7f])
\s*[^\/]+\/[^,;]+(;\s*[^=]+(?<!\bq)=[^,;]+)*(;\s*q=[01](\.\d{1,3})?)?
(,\s*[^\/]+\/[^,;]+(;\s*[^=]+(?<!\bq)=[^,;]+)*(;\s*q=[01](\.\d{1,3})?)?)*
\s*$/
说明:
^-锚定至管柱起点
?!.*[:?@\[\\]{}\x00-\x08\x0a-\x1f\x7f]-测试任何无效字符的负前瞻性:贪婪。*最多匹配[…]个字符类
\s*-在可选空白上扫描
[^\/]+\/[^,;]+-扫描1+个字符、a/,以及任何小于或;,e、 g.媒体类型,如文本/纯文本
... * - 在可选键=值模式上扫描,从零到多次:
;\s*-扫描过;分隔符和可选空白
[^=]+? - 扫描最大为=,但不扫描q的任何内容
=-扫描=
[^,;]+-扫描任何高达或;
... ? - 扫描可选的q=1或q=0.001模式:
;\s*-扫描过;分隔符和可选空白
q=[01]-在q=0或q=1上扫描
\.\d{1,3}?-然后是可选的。和基于RFC的1至3位数字
到目前为止,第一种媒体类型已被涵盖
... * - 扫描可选的零到多个其他媒体类型:
,\s*-扫描范围、分隔符和可选空白
后跟与上面相同的模式:扫描媒体类型,扫描可选键=值模式,以;,扫描可选的q=。。。图案
\s*-在可选空白上扫描
$-末端的锚定字符串
修正了typo@SamG101:有问题吗?这符合你的需要吗?@SamG101:愿意接受答案吗?帮助可以是双向的。@SamG101:为了感谢人们花在帮助你上的时间,你可以接受一个可以接受的答案。请参见问题旁边的灰色复选标记。
/^(?!.*[():<>?@\[\\\]{}\x00-\x08\x0a-\x1f\x7f])
\s*[^\/]+\/[^,;]+(;\s*[^=]+(?<!\bq)=[^,;]+)*(;\s*q=[01](\.\d{1,3})?)?
(,\s*[^\/]+\/[^,;]+(;\s*[^=]+(?<!\bq)=[^,;]+)*(;\s*q=[01](\.\d{1,3})?)?)*
\s*$/