如何将正则表达式作为函数参数传递

11

为什么这个返回 false 而不是 true。

function doit(expression) {

    var regex = new RegExp(expression, 'g');

    alert(regex.test('mename@memail.com'));
}

doit("/^\w+([-+.\']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/");
​

http://jsfiddle.net/hAV8Q/


它无法工作,因为new RegExp不希望被斜杠括起来的字符串;第一个和最后一个字符是文字正则表达式模式的一部分。 - apsillers
2个回答

23

要么正确地格式化您的表达式:

function doit(expression) {
    var regex = new RegExp(expression, 'g');
    alert(regex.test('mename@memail.com'));
}

doit("^\\w+([-+.\\']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*");
// no / here, escape \

或直接传递表达式:

function doit(expression) {
    alert(expression.test('mename@memail.com'));
}

doit(/^\w+([-+.\']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/g);

斜杠(/)不是表达式的一部分,它们表示一个正则表达式字面量。如果你使用包含表达式的字符串,则必须省略它们并转义每个反斜杠,因为反斜杠在字符串中也是转义字符。


2
由于反斜杠是字符串中的转义字符,您需要转义所有反斜杠,例如 \\w 而非 \w。如果您只是像这个答案中的第二个选项一样提供一个实际的 RegExp 对象而不是一个字符串,那么您的代码将会更加简洁。 - apsillers
@RegisteredUser: 当你在字符串中有反斜杠时,你需要对其进行转义:http://jsfiddle.net/Guffa/hAV8Q/4/ - Guffa
对,我忘记了要转义反斜杠...这就是为什么我避免使用正则表达式作为字符串的原因 ;) - Felix Kling

4
因为在使用new RegExp()创建正则表达式时,不需要使用分隔符。请从字符串前后移除/
或者,通过移除引号并省略new RegExp()调用,直接传递正则表达式本身。

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