使用正则表达式验证用户代理

Validate Useragent with Regex

我正在尝试验证具有以下格式的用户代理

Mozilla/5.0 (Linux; U; Android <android>; <locale>; <device> Build/<build>) AppleWebKit/<webkit> (KHTML, like Gecko) Version/4.0 Mobile Safari/<safari>

用户代理可以是

Mozilla/5.0 (Linux; U; Android 4.2.2; en-us; AFTB Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30

到目前为止我的正则表达式是

Mozilla\/5\.0 \(Linux; U; Android (\d+\.)?(\d+\.)?(\*|\d+); [a-z]{2}-[a-z]{2} (AFTA|AFTN|AFTS|AFTB|AFTT|AFTM|AFTKMST12|AFTRS) Build\/([A-Z0-9])\) AppleWebKit\/(\d+\.)?(\*|\d+) \(KHTML, like Gecko\) Version\/4\.0 Mobile Safari\/(\d+\.)?(\*|\d+)

测试:https://regex101.com/r/nXKYBB/1

但是不匹配。有什么问题吗?

您错过了 en-de 之后的 ;[A-Z0-9] 之后的 +:

Mozilla\/5\.0 \(Linux; U; Android (\d+\.)?(\d+\.)?(\*|\d+); [a-z]{2}-[a-z]{2}; (AFTA|AFTN|AFTS|AFTB|AFTT|AFTM|AFTKMST12|AFTRS) Build\/([A-Z0-9]+)\) AppleWebKit\/(\d+\.)?(\*|\d+) \(KHTML, like Gecko\) Version\/4\.0 Mobile Safari\/(\d+\.)?(\*|\d+)

regex demo

请注意,如果您不打算稍后使用那些捕获的子值,那么匹配非捕获组 (?:...) 而不是捕获组可能是个好主意,并使用 \s 来匹配空格。

此外,如果您打算匹配整个字符串,请用 ^$ 包裹模式。