2012-11-19 34 views
3

我在Javascript中使用正則表達式來嗅探用戶代理字符串。這是下面的一些僞代碼:用於檢查用戶代理字符串中是否存在關鍵字的正則表達式

is_not_tablet_bool = /android.+mobile/i.test(navigator.userAgent.toLowerCase()); 
switch(true) 
{ 
    case (is_not_tablet_bool): 
     return true; 
    break; 
} 

我想製作一個正則表達式,會做一些接近上述相反的即

  1. 確保「機器人」關鍵字出現在串,並在同一時間
  2. 確保「移動」的關鍵字是字符串缺席

感謝您的預期幫助。

回答

6

負先行

正則表達式有一個所謂的負先行構建其在正則表達式匹配字符串而不捕獲先行部分:

你的正則表達式應該這樣寫:

/android(?!.*mobile)/i 

這將匹配任何字符串,其中包含單詞android之後沒有字mobile被忽略的情況。這也意味着您可以刪除toLowerCase呼叫。

增加:負回顧後

如果你只需要匹配那些有字的Android它們,卻缺乏移動(之前或之後),那麼負向前看符號和lookbehinds會做的組合的字符串。

/(?<!mobile.*)android(?!.*mobile)/i 

但問題是,JavaScript不支持負lookbehinds。所以你必須採用不同的技巧來幫助你確定這種情況。

有幾種可能性,其下面的似乎是最有趣的(也是最後一個有用的):

  1. 更換匹配的負字符串,隨後就會失敗:

    var nav = navigator.userAgent.replace(/mobile.*android/, "fail"); 
    return /android(?!.*mobile)/i.test(nav); 
    
  2. 使用兩向前看符號。一個在正常的字符串,另一個在相反的一個,同時還具有反轉的正則表達式:

    var nav = navigator.userAgent; 
    var after = /android(?!.*mobile)/i.test(nav); 
    var before = /diordna(?!.*elibom)/i.test(nav.split("").reverse().join("")); 
    return before && after; 
    
  3. 簡單是關鍵。兩個簡單的正則表達式會做的伎倆也很不錯:

    var nav = navigator.userAgent; 
    return /android/i.test(nav) && !/mobile/i.test(nav); 
    

注:我不知道你的代碼是否是實際的代碼,因爲如果是我強烈建議您重新考慮使用switch(true)聲明,並簡單地將其替換爲
return is_not_tablet_bool;

+1

非常感謝。我想我會隨着簡單(第3號門)走,因爲我還不是一個正則表達式忍者。至於'switch'的使用,我正在對字符串進行多重檢查,但我想在某些情況爲真時返回一個值,所以我需要使用該語句。乾杯。 –

0

我不認爲使用正則表達式會使這個任務變得更容易。我只需使用String.indexOf(...) method來檢查是否包含這些字符串:

function isNotAndroidMobile(userAgentString) { 
    var ua = userAgentString.toLowerCase(); 
    return (ua.indexOf('android')>=0) && (ua.indexOf('mobile')===-1); 
} 
+0

我想這也可以。謝謝。 –

相關問題