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

ドットはすべてに一致します。正規表現では、ドットは任意の文字に一致するワイルドカードであるため、 のリテラル ドットと一致しますjohn.ga@gmail.comが、アンダースコア とjohn_wb@gmail.com同じように簡単に一致します。

リテラル ドットに一致させるには、 so のようにバックスラッシュでエスケープする必要があります\.。また、特別な意味を持つ他の文字もあります。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 に答える