1

次のコードがあります。

var stringToMatch = "De$mond. \(blah)";
var pattern = "^" + stringToMatch;
var regex = new RegExp(pattern, "i");

return regex.test("testing De$mond.");

今、私はstringToMatchそれを使用する前にエスケープする必要がありますpattern

私がここで見つけた解決策は、私が正しく理解していれば、この方法を提案しています:

var stringToMatch = "De$mond. \(blah)";
stringToMatch = stringToMatch.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");

var pattern = "^" + stringToMatch;
var regex = new RegExp(pattern, "i");

return regex.test("testing De$mond.");

stringToMatch代わりにすべての文字を単純にエスケープできないのはなぜですか?

例えば

  var stringToMatch = "De$mond. \(blah)";
  var stringToMatchAsArrayOfChars = [];
  for (var i = 0; i < stringToMatch.length; i++)
  {
    stringToMatchAsArrayOfChars.push(stringToMatch.substr(i, 1));
  }
  var stringToMatchEscaped = "";
  for (var i = 0; i < stringToMatchAsArrayOfChars.length; i++)
  {
    if (stringToMatchAsArrayOfChars[i] !== " ")
    {
      stringToMatchEscaped = stringToMatchEscaped + "\\" + stringToMatchAsArrayOfChars[i];
    }
    else
    {
      stringToMatchEscaped = stringToMatchEscaped + " ";
    }
  }

  var pattern = "^" + stringToMatch;
  var regex = new RegExp(pattern, "i");

  return regex.test("testing De$mond.");

上記の方法ははるかに冗長であることは理解していますが、基本的には次のとおりです。

  var stringToMatchEscaped = "\D\e\$\m\o\n\d\. \\\(\b\l\a\h\)";

しかし、それは機能していません。何故ですか?

また、stringToMatch私が提供したリンクで提案されている以外のエスケープ方法はありますか? つまり、エスケープする文字を指定せずに/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g?

4

1 に答える 1

0

これは、文字列入力から安全な正規表現パターンを作成するための単純な正規表現です。

  var pattern= "De$mond.";
  var regex = new RegExp(pattern.replace(   /([.*+?^${}()|[\]\/\\])/g   , '\\$1'), "i");

  regex.test("testing De$mond. string here."); // === true

これは、「ワイルドカード」または任意の正規表現構文を使用できないことを意味しますが、ソース テキストからパターンへのリテラル マッチを実行する実際の正規表現になることに注意してください。

于 2013-06-11T20:19:36.987 に答える