0

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

  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/

如何解决这个问题。

4

3 回答 3

0

.是正则表达式中的匹配所有字符,因此您需要将其转义

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

更新了 JSFiddle

于 2013-11-14T12:12:53.870 回答
0

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

要匹配文字点,您需要使用反斜杠对其进行转义,例如\.. 此外,还有其他具有特殊含义的字符。仅将 searchData 连接到您的模式可能会给您留下各种未转义的特殊字符,甚至可能使您的表达式无效,导致错误,或者可能创建一个非常慢的匹配,这将永远持续下去。
如果 JavaScript 中没有库函数可以转义所有特殊字符,您应该自己创建一个。

于 2013-11-14T12:13:23.747 回答
0

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

你需要逃避它:

var searchData = "john\.";

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

于 2013-11-14T12:18:16.820 回答