Regex 正则表达式不允许在包含捕获组的字符串中的任何位置使用字符

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除外 因

使用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*$/