繁体   English   中英

正则表达式匹配接受语言标头

[英]Regex to match accept-language header

我正在尝试匹配 http 请求的以下接受语言标头字段。

var regex = /([^-]*)(?:-([^;]*))?(?:;q=([0-9].[0-9]))?/
"en-us;q=0.8".match(regex) => ["en-us;q=0.8", "en", "us", "0.8"]
"en".match(regex) => ["en", "en", undefined, undefined]
"en;q=0.8".match(regex) => ["en;q=0.8", "en;q=0.8", undefined, undefined]

问题出在最后一行。 恕我直言,它应该产生:

["en;q=0.8", "en", "0.8", undefined]

我的正则表达式有什么问题?

您的第一个捕获组匹配所有不包含破折号并在破折号处停止的内容- 在您的最后一个字符串中,您没有破折号,因此它匹配整个字符串。 正则表达式的其他部分是可选的,因此它们不匹配。

您可以通过不允许; 在您的第一个捕获组中:

/([^-;]*)(?:-([^;]*))?(?:;q=([0-9]\.[0-9]))?/

PS:我还在最后一个捕获组中修复了您的点。 它匹配任何字符,现在它只匹配. 特点。

由于@ioquatix 从未提交过更好地遵循RFC3066 Section 2.1的答案,因此我发布的版本应该更符合标准:

/^((?<primary>\*|([A-Z]{1,8}))((?<!\*)-(?<subtag>[A-Z0-9]{1,8}))?)(;q=(?<quality>1|0|0.[0-9]{1,3}))?$/i

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM