0

我正在使用 UA-Parser 创建用于分析的设备表...我有一个来自我们服务器的用户代理字符串的 csv。我正在使用库存的 UA-Parser for Node 包(ua-parser-js。)

但是,我在解析一些 Droid 用户代理字符串时遇到了困难。

Droid 的当前正则表达式是

 /\s((milestone|droid[2x]?))[globa\s]*\sbuild\//i

以上匹配

Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; DROIDX Build/4.5.1_57_DX8-51) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1,182

但是不匹配

Mozilla/5.0 (Linux; U; Android 4.1.2; en-us; DROID RAZR Build/9.8.2O-72_VZW-16) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30,652
Mozilla/5.0 (Linux; U; Android 2.3.5; en-us; DROID X2 Build/4.5.1A-DTN-200-18) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1,152

应该如何修改正则表达式来过滤上述字符串?

4

4 回答 4

1

为了解决这个问题,我们需要隔离导致我们出现问题的字符串部分。

让我们把字符串剪下来,只在我们感兴趣的字符串部分:

DROIDX Build比较DROID RAZR BuildDROID X2 Build

我们可以看到它们都匹配droid,并且[2x]是可选的,所以没关系。

问题出在下一点:[globa\s].

这不是可选的,并且要求紧跟在单词之后droid(有或没有后面的2or X),我们在这个列表中有一个或多个字符g, l, o, b, a, 或一个空格。

我们有RAZR并且X2在失败的字符串中。如果这些单词中的任何字符不在上述列表中,则匹配失败。(事实证明,列表中几乎没有任何字符,但单个字符会失败)。

因此,这里快速简单的解决方法是将字符r、、z和添加x到.2globa\s

这将为给定的示例修复它 - 即它现在将接受字符串的这一部分中的RAZRor X2

但是,为了考虑其他可能的情况,您可能希望稍微宽松一点,并允许任何字母数字字符。这取决于您,但无法预测未来会出现哪些 UA 字符串。

因此,我建议将整个替换globaa-z0-9.

 /\s((milestone|droid[2x]?))[a-z0-9\s]*\sbuild\//i

即使这样也可能无法找到所有可能出现的变体,但这就是用户代理字符串的问题;它们并不是一种定义明确的格式;它们几乎可以包含任何东西。

[编辑] OP 添加了一个请求,要求将RAZRorX2字符串包含在返回的结果字符串中。

简短的回答是,这意味着将模式的相关部分移动到模式旁边的括号部分droid

然而,这确实使事情复杂化,因为虽然我们希望包含这些字符串,但我们可能不希望之前排除的其他字符串 - 即之前与globa\s模式匹配的字符串。这里的问题是我没有任何示例说明这些被排除的字符串可能是什么,或者为什么它们被排除在外。同样,我不知道我们想要包含哪些字符串,超出RAZRor X2。我想我们需要相对宽容一些,但是在不知道可能性的情况下要知道如何区分它们并不容易(事实上,即使我们知道它们也可能非常困难)。

鉴于上述情况,对我开放的唯一真正选择是建议将RAZR和添加X2到括号中的部分,以便专门选择它们:

 /\s((milestone|droid[2x]?(\s(razr|x2)\s)?))[a-z0-9\s]*\sbuild\//i

这将匹配两个所需的字符串。

当然,问题在于它不会匹配此处未描述的任何其他可能的变体。允许更多需要更多地了解可能的变体是什么,但由于我们只被要求查看这些特定示例,所以我现在只能提供这些。

于 2013-05-19T20:53:57.987 回答
0

其他人都说的,但一个更简单的版本..

/\s((milestone|droid[2x]?))[globa\w\s]*\sbuild\//i

只需添加一个 \w 即可捕获 droid 后缀。

于 2013-05-19T21:30:24.480 回答
0

如果只需要添加 RAZR 和 X2 支持:/\s((milestone|droid(?:2|x|\s+razr|\s+x2)?))[globa\s]*\sbuild\//i

编辑:公平警告,我不知道预期值是多少,我只是基于您在问题中发布的 UA 字符串。

于 2013-05-19T20:46:57.130 回答
0

这匹配所有三个:

/\s(milestone|droid[x]?\s[^\s]*)[globa\s]*build\//i

它匹配:

a whitespace character, then
either: 'milestone' OR 'droid' followed by 0 or 1 'x' characters, then
    a whitespace character, then
    zero to infinite characters that aren't white space,then
zero to infinite characters g,l,o,b,a, or whitespace then
'build' then
the '/' character

全部以不区分大小写的方式。

它与以下内容匹配DROIDX Build/

 Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; DROIDX Build/4.5.1_57_DX8-51) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1,182

DROID RAZR Build/

Mozilla/5.0 (Linux; U; Android 4.1.2; en-us; DROID RAZR Build/9.8.2O-72_VZW-16) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30,652

DROID X2 Build/

Mozilla/5.0 (Linux; U; Android 2.3.5; en-us; DROID X2 Build/4.5.1A-DTN-200-18) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1,152
于 2013-05-19T20:58:19.827 回答