使用正则表达式的.match()方法返回null。

35

我试图做一件我觉得应该很容易的事情,即通过匹配正则表达式来限制字符串中的某些字符。

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);

由于某些原因,当使用match时它总是返回null。有没有办法修复这个问题,或者有更好的方法来解决这个问题?

注意:此处的代码是一个更大代码段的片段,而且值和类型变量通常由另一个方法定义。


2
它返回null是因为你的字符串中有一个1,所以它不匹配。将其更改为有效字符串将返回该字符串。http://jsfiddle.net/GLVAj/ - James Montagne
3个回答

55

您需要使用 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
我把正则表达式模式放在单引号里,这就是我的问题... :D) - Leniel Maccaferri

18

正则表达式必须用 / 括起来,而不是 ',这样 JavaScript 才会创建一个正则表达式类型的变量,而不是字符串类型的变量。因此,例如针对你的 ALPHA 情况,你应该有

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

请查看MDN关于使用.match的更多信息页面


1

你的代码看起来像是在一个 function { ... } 中。你有 return 吗?如果没有,那就是为什么你得到了 null 的原因...

此外,正则表达式应该用斜杠 (/.../) 包围,而不是引号。


我已经修复了代码,我的意思是value.match(regex)返回null,而不是函数本身。 - MichaelH
一个不返回任何值的函数所返回的值是 undefined,而不是 null - Adonis K. Kakoulidis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接