2011-12-29 163 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