我正在尝试匹配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]
我的正则表达式出了什么问题?
答案 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