[英]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.