簡體   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