2013-05-19 31 views
0

我正在使用UA-Parser創建分析設備的表格......我從我們的服務器獲取了csv的用戶代理字符串。我正在使用股票UA解析器節點包(ua解析器-js)如何編寫正則表達式來搜索UA-Parser中的項目?

但是,我有困難的解析一些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 

應如何修改正則表達式來過濾上述字符串?

+0

我的歉意。謝謝@Spudley增加環境。 –

回答

1

要解決這個問題,我們需要隔離導致我們遇到問題的那部分字符串。

讓我們切串下來,只在我們感興趣的字符串的一部分:

DROIDX BuildDROID RAZR BuildDROID X2 Build

相比,我們可以看到,它們都符合droid,和[2x]是可選的,所以沒關係。

問題出在下一位:[globa\s]

這不是可選的,需要的話droid後立即(帶或不帶以下2X),我們在這個列表中的字符中的一個或多個globa,或一個白色空間。

我們在失敗的字符串中有RAZRX2。如果這些單詞中的任何字符不在以上列表中,則匹配失敗。 (事實證明,幾乎沒有任何字符出現在列表中,但是單個字符會失敗)。

所以這裏的快速和簡單的解決方法是添加字符rzx2globa\s

這將修正它給定的例子 - 即它現在將接受RAZRX2在這一部分的字符串。

但是,爲了考慮其他可能的情況,您可能希望稍微寬鬆並允許使用任何字母數字字符。這取決於你,但是沒有預測UA字符串將在未來出現。

因此,我會建議更換整個globa,但a-z0-9

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

即使這可能沒有拿起可能出現的所有可能的變體,但這是用戶代理字符串的問題;他們不完全是一個明確的格式;他們可以包含任何東西。

[編輯]的OP增加了對RAZRX2串被包含在返回的結果字符串的請求。

簡而言之,這意味着這將意味着將模式的相關部分移至括號內的部分,並與droid模式一起移動。

但是,這確實使事情變得複雜,因爲雖然我們希望包含這些字符串,但我們可能不希望先前排除的其他字符串,即以前與globa\s模式匹配的字符串。這裏的問題是我沒有任何這些被排除的字符串可能存在的例子,或者爲什麼它們被排除。同樣,除了RAZRX2之外,我不知道我們想要包含什麼字符串。我猜想我們需要相對寬鬆,但要知道如何在不知道可能性的情況下區分它們並不容易(事實上,即使我們知道它們可能也很困難)。

鑑於上述情況,開給我的唯一真正的選擇是建議增加RAZRX2到括號內的部分,讓他們專門挑了起來:

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

這將同時匹配所需的字符串。

這個問題當然是,它不會匹配任何其他可能的變種,這裏沒有描述。允許更多的需要更多地瞭解可能的變體是什麼,但是因爲我們只被要求看這些具體的例子,這就是我現在可以提供的。

+0

感謝@Spudley,這似乎工作。我發現用戶代理字符串幾乎可以包含任何內容的困難方式。有沒有辦法包含下標「RAZR」或「X2」。我目前只獲得「DROID」。 –

+0

@RamIyer - 你的意思是「在返回的結果中包含RAZR或X2嗎?好的,我將編輯它的幫助答案(它會使事情變得複雜一點) – Spudley

+0

謝謝,是包含RAZR或X2。 –

0

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

編輯:公平的警告,我不知道該預期值可以是什麼,我只是根據該在UA字符串您在投稿題。

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 
+0

感謝@Hurricane Hamilton,這似乎也起作用了。請參閱我上面的評論以迴應Spudley的回覆。 –

0

什麼其他人說,但一個簡單的版本..

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

只需添加一個\ w來捕獲droid後綴。