1

在下面的代码中,我想使用第一个 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");
    }
}

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

4

2 回答 2

2

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

  • 反斜杠被吃掉,因为它们只是对以下字符进行字符串转义。"\b"相当于"b"。您需要对它们进行双重转义:"\\b"
  • 您不能test对它们调用该方法。您需要用它们构造RegExp对象

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

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");
    }
}
于 2013-05-28T17:04:48.727 回答
1

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

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

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

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

此外,您需要取出第一个图案周围的/和。/只有在 JavaScript 代码中使用正则表达式字面量时才需要它们,在将字符串转换为正则表达式时不需要它们。

于 2013-05-28T17:01:24.500 回答