2013-05-28 58 views
1

在下面的代码中,我想验证messageText与第一个validationPattern并显示来自validationPatterns数组的相应消息。模式和消息由管道分隔“|”字符。正则表达式javascript返回意外结果

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

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

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

+1

*意外结果*是什么意思?你得到了什么,你期望什么?当我尝试运行代码时,出现运行时错误:'TypeError:Object /^.{6,7}$/'没有方法'test''。而不是使用一个字符串来保存由'|'分开的两个值,我会使用一个数组。 –

回答

2

您的validationpatterns是字符串。这意味着:

  • 反斜杠被吃掉,因为它们只是字符串转义以下字符。 "\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"); 
    } 
} 
+0

谢谢你解决了我的问题。我没有考虑使用2D阵列:( – rajmalhotraml

+0

@rajmalhotraml:实际上,你已经做到了,只有它内部只包含一个字符串。 – Bergi

+0

@rajmalhotraml错误非常明显!!!以及为什么使用错误消息以及可以使用i值来猜测错误消息的表达式。 –

1

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

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

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

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

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

+0

谢谢你的回答。我试过这个问题,但经过几次迭代解决我错过了。 当我使用这一行时,无论messageText变量中有多少个字符,我都会得到结果“no”。 – rajmalhotraml

+0

请在前面的回答帮助下解决这个问题。 – rajmalhotraml