2011-12-29 84 views
12

我想要做一些我認爲會很容易做的事情,即通過匹配正則表達式來限制字符串到某些字符。.match()用正則表達式返回null

var value = 'FailureStr1ng'; 
var type = 'ALPHA'; 
var regex = null; 

switch(type) { 
    case 'ALPHA': 
     regex = '^[a-zA-Z]+$'; 
     break; 
    case 'NUMERIC': 
     regex = '^[0-9]+$'; 
     break; 
    case 'ALPHANUMERIC': 
     regex = '^[a-zA-Z0-9]+$'; 
     break; 
} 

return value.match(regex); 

由於某種原因,使用匹配時它總是返回null。有沒有辦法解決這個問題,或更好的方法來做到這一點?

注意:這裏的代碼是一個更大的代碼片段,反過來,值和類型變量通常由另一個方法定義。

+2

它返回null,因爲你在字符串中有一個'1',所以它不匹配。將其更改爲有效的字符串將返回該字符串。 http://jsfiddle.net/GLVAj/ – 2011-12-29 04:05:34

回答

27

您想要RegExp.test,它測試匹配的值而不是檢索匹配。與您現有的代碼,這將意味着:

if(!new RegExp(regex).test(value)){ 
    alert('Your string was invalid.'); 
} 

然而,這將是最好使用正則表達式文字而不是字符串,因爲他們更高效,清晰,不易出錯:

var value = 'FailureStr1ng'; 
var type = 'ALPHA'; 
var regex = null; 

switch(type) { 
    case 'ALPHA': 
     regex = /^[a-zA-Z]+$/; 
     break; 
    case 'NUMERIC': 
     regex = /^[0-9]+$/; 
     break; 
    case 'ALPHANUMERIC': 
     regex = /^[a-zA-Z0-9]+$/; 
     break; 
} 

if(!regex.test(value)) { 
    alert('Your string was invalid.'); 
} 

更妙的是,使用字典:

var expressions = { 
    ALPHA: /^[a-zA-Z]+$/, 
    NUMERIC: /^[0-9]+$/, 
    ALPHANUMERIC: /^[a-zA-Z0-9]+$/ 
}; 

if(!expressions[type].test(value)) { 
    alert('Your string was invalid.'); 
} 
+3

謝謝!完美運作。只要stackoverflow讓我選擇正確的答案。 – MichaelH 2011-12-29 04:03:25

+0

我正在把單引號內的正則表達式模式,這是我的問題......:D) – 2015-01-04 15:16:37

7

正則表達式必須/,不'包圍,使JavaScript的創造型雷傑的變量x,不是字符串類型。因此,例如,你的ALPHA情況下,你應該有

regex = /^[a-zA-Z]+$/; 

有關使用.match更多信息,請參閱MDN's page on .match

+0

謝謝,我會放棄。 – MichaelH 2011-12-29 04:00:54

1

您的代碼看起來像是在function { ... }中。你是否需要任何東西?如果沒有,這就是爲什麼你回null ...

此外,正則表達式包圍斜槓(/.../),而不是引號。

+0

我已經修復了代碼現在,我的意思是value.match(正則表達式)返回null。不是功能。 – MichaelH 2011-12-29 04:00:30

+0

從不返回任何東西的函數返回的值是'undefined',而不是'null'。 – 2017-04-16 18:12:42