2010-05-07 24 views
1

我用JavaScript來檢測特定的擊鍵匹配特定的號碼,而寫方法我想我會嘗試的正則表達式和test()方法,並提出了:Javascript功能來使用正則表達式

if (/8|9|37|38|46|47|48|49|50|51|52|53|54|55|56|57|96|97|98|99|100|101|102|103|104|105|110/.test(num)) { 
    // do something if there's a match 
} 

這似乎並沒有工作100%,因爲有些值似乎使它通過了正則表達式測試,如83.我已經繼續前進,但我仍然好奇,爲什麼這不起作用。

+7

**請不要**。 – SLaks 2010-05-07 20:06:41

+0

你說你正在檢測擊鍵,當它通過83,你確定它沒有真正通過8條件? – house9 2010-05-07 20:08:02

+0

這是有史以來的UGLIEST正則表達式。 Gah – 2010-05-07 20:08:14

回答

6

這是完全錯誤的方法來做到這一點。

要回答這個問題,正則表達式就是匹配你的字符串的一部分。字符串83通過匹配8
您需要通過在開始處放置^(並在末尾放置)$來鎖定您的正則表達式。

正確方法是做一個有效數字的數組,並使用parseInt進行比較。

例如:

var validNumbers = [ 8, 9, 37, 38, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 110 ]; 

if (validNumbers.indexOf(parseInt(num, 10)) >=0) { 
    //Match 
} 

你需要對IE的indexOf功能:

if (!Array.prototype.indexOf) { 
    Array.prototype.indexOf = function(needle) { 
     for(var i = 0; i < this.length; i++) { 
      if(this[i] === needle) { 
       return i; 
      } 
     } 
     return -1; 
    }; 
} 
+0

感謝您解決正則表達式問題並將我引入原型。爲什麼這完全是錯誤的做法呢?性能?可讀性?可維護性?這個例子是檢測關鍵代碼,如果它正在搜索一個字符串的實例呢?在這種情況下,test()是適當的還是隻使用search()。 – 2010-05-08 11:50:36

2

你需要指定字符串的開頭和結尾。否則88|…將匹配883

/^(8|9|37|38|46|47|48|49|50|51|52|53|54|55|56|57|96|97|98|99|100|101|102|103|104|105|110)$/.test(num) 

但是,你應該寧願使用數值比較。如果你不喜歡列出每一個號碼,你可以使用的範圍是這樣的:

function foo(number, numbers) { 
    for (var i=0; i<numbers.length; ++i) { 
     if (numbers[i] === number) { 
      return true; 
     } else if (numbers[i].constructor === Array) { 
      if (numbers[i][0] <= number && number <= numbers[i][1]) { 
       return true; 
      } 
     } 
    } 
    return false; 
} 
var numbers = [8, 9, 37, 38, [46, 57], [96, 105], 110]; 
if (foo(num, numbers)) { 
    // … 
} 
1

如果您喜歡/\b(100|101)/g一個正規表示它將匹配只有100和101,而不是5100,5101或101 ... ...;

唯一的問題是,如果您使用的是負數,例如101和-101都與正則表達式匹配。

我知道這是因爲我正面臨和想要避免。