負先行
正則表達式有一個所謂的負先行構建其在正則表達式匹配字符串而不捕獲先行部分:
你的正則表達式應該這樣寫:
/android(?!.*mobile)/i
這將匹配任何字符串,其中包含單詞android之後沒有字mobile被忽略的情況。這也意味着您可以刪除toLowerCase
呼叫。
增加:負回顧後
如果你只需要匹配那些有字的Android它們,卻缺乏移動(之前或之後),那麼負向前看符號和lookbehinds會做的組合的字符串。
/(?<!mobile.*)android(?!.*mobile)/i
但問題是,JavaScript不支持負lookbehinds。所以你必須採用不同的技巧來幫助你確定這種情況。
有幾種可能性,其下面的似乎是最有趣的(也是最後一個有用的):
更換匹配的負字符串,隨後就會失敗:
var nav = navigator.userAgent.replace(/mobile.*android/, "fail");
return /android(?!.*mobile)/i.test(nav);
使用兩向前看符號。一個在正常的字符串,另一個在相反的一個,同時還具有反轉的正則表達式:
var nav = navigator.userAgent;
var after = /android(?!.*mobile)/i.test(nav);
var before = /diordna(?!.*elibom)/i.test(nav.split("").reverse().join(""));
return before && after;
簡單是關鍵。兩個簡單的正則表達式會做的伎倆也很不錯:
var nav = navigator.userAgent;
return /android/i.test(nav) && !/mobile/i.test(nav);
注:我不知道你的代碼是否是實際的代碼,因爲如果是我強烈建議您重新考慮使用switch(true)
聲明,並簡單地將其替換爲
return is_not_tablet_bool;
。
非常感謝。我想我會隨着簡單(第3號門)走,因爲我還不是一個正則表達式忍者。至於'switch'的使用,我正在對字符串進行多重檢查,但我想在某些情況爲真時返回一個值,所以我需要使用該語句。乾杯。 –