正则表达不考虑。在javascript中进行模式测试

时间:2013-11-14 12:08:19

标签: javascript regex

下面是检查表达式的代码。它将检查字符串的开始,空格之后和@之后。

  var mail1 = "john.ga@gmail.com";
var mail2  = "john_wb@gmail.com";

var searchData = "john.";

var pattern1 = new RegExp("(?:^|[\\s\@])"+searchData, "i");
if(pattern1.test(mail1)){
   console.log("matched is:::"+mail1.match(pattern1));
}
 if(pattern1.test(mail2)){
   console.log("matched is:::"+mail2.match(pattern1));
}

它不应该与mail2匹配。但它不考虑“。”并匹配mail2。

小提琴:http://jsfiddle.net/LQg7W/2319/

但是当我将“searchData”变量设为“john_”时,它会正确搜索 小提琴:http://jsfiddle.net/LQg7W/2320/

如何解决此问题。

3 个答案:

答案 0 :(得分:0)

.匹配正则表达式中的所有字符,因此,您需要通过

转义它
var pattern1 = new RegExp("(?:^|[\\s\@])"+searchData.replace(/\./g, '\\.'), "i");

更新了JSFiddle

答案 1 :(得分:0)

Dot匹配所有。在正则表达式中,点是与任何字符匹配的通配符,因此它与john.ga@gmail.com中的文字点匹配,但它与john_wb@gmail.com中的下划线匹配同样容易。

要匹配文字点,您需要使用反斜杠对其进行转义,例如\.。此外,还有其他字符具有特殊含义。只需将searchData连接到您的模式就可以为您提供各种未转义的特殊字符,甚至可以使表达式无效,导致错误,或者可能创建一个永远需要的非常慢速匹配。 /> 如果JavaScript中没有库函数来逃避所有特殊字符,你应该自己创建一个。

答案 2 :(得分:0)

searchData中的点未转义,因此它匹配任何字符。

你需要逃脱它:

var searchData = "john\.";

如果您需要更通用的方法来转义搜索模式,您可能会发现此问题很有用:Is there a RegExp.escape function in Javascript?