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

时间:2013-11-07 12:16:17

标签: javascript regex http-headers

我正在尝试匹配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]

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

2 个答案:

答案 0 :(得分:3)

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

您可以通过在第一个捕获组中不允许;来解决此特定情况:

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

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

答案 1 :(得分:0)

由于@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