正则表达式javascript返回意外结果

时间:2013-05-28 16:53:45

标签: javascript regex

在下面的代码中,我想用第一个validationPattern验证messageText并显示validationPatterns数组中的相应消息。模式和消息由管道“|”分隔字符。

为此我使用下面的代码并且总是得到错误的结果。有人可以看看这个并帮助我吗?

var messageText = "Message1234";
var validationPatterns = [
    ['\/^.{6,7}$/|message one'],
    ['\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b|message two']
];
for (var i = 0; i < validationPatterns.length; i++) {
    var validationvalues = validationPatterns[i].toString();

    var expr = validationvalues.split("|")[0];
    console.log(expr.constructor);

    if(expr.test(messageText)) {
       console.log("yes");
    } else {
       console.log("no");
    }
}

我知道我们不能将管道用作分隔符,因为管道也是正则表达式的一部分。但是我稍后会改变它。

2 个答案:

答案 0 :(得分:2)

您的验证模式是字符串。这意味着:

  • 反斜杠被吃掉,因为它们只是字符串 - 转义以下字符。 "\b"相当于"b"。您需要对它们进行双重转义:"\\b"
  • 您无法在其上调用test方法。您需要构建RegExp objects

虽然可以解决这个问题,但如果你只使用正则表达式文字并将它们作为对象(或数组)的不同属性从消息中分离出来会更好。

var inputText = "Message1234";
var validationPatterns = [
    [/^.{6,7}$/, 'message one'],
    [/\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/, 'message two']
];
for (var i = 0; i < validationPatterns.length; i++) {
    var expr = validationPatterns[i][0],
        message = validationPatterns[i][1];
    console.log(expr.constructor); // RegExp now, not String

    if(expr.test(inputText)) {
       console.log(message+": yes");
    } else {
       console.log(message+": no");
    }
}

答案 1 :(得分:1)

您的expr变量仍然只是一个字符串(validationvalues.split("|")[0]将返回一个字符串)。这就是它不能作为正则表达式的原因。

您需要在expr的初始定义后添加一行。

expr = new RegExp(expr, 'i');

'i'只是一个如何使用不区分大小写的标志或其他标志的示例。如果需要区分大小写的搜索(默认值),请使用空字符串。

此外,您需要取出围绕第一个模式的//。只有在JavaScript代码中使用正则表达式文字时才需要它们,并且在将字符串转换为正则表达式时不需要它们。