次の式があります: ^(0|1)\\1{1,}$
.
で使用した場合にのみ機能するのはなぜnew RegExp()
ですか?
// return always false
/^(0|1)\\1{1,}$/.test("000");
// it works!
var pattern = new RegExp("^(0|1)\\1{1,}$");
pattern.test("000");
次の式があります: ^(0|1)\\1{1,}$
.
で使用した場合にのみ機能するのはなぜnew RegExp()
ですか?
// return always false
/^(0|1)\\1{1,}$/.test("000");
// it works!
var pattern = new RegExp("^(0|1)\\1{1,}$");
pattern.test("000");
2 番目のバックスラッシュを削除します。
/^(0|1)\1{1,}$/.test("000"); // true
これが機能する理由は、バックスラッシュが正規表現リテラルでは文字どおりに扱われ、文字列ではエスケープされるためです (その後、正規表現で再びエスケープされます)。
例えば:
new RegExp('\\\\').test('\\'); // true
/\\\\/.test('\\'); // false
new RegExp('\\\\').source; // '\\' - one backslash
/\\\\/.source; // '\\\\' - two backslashes
console.log('\\'); // shows one backslash
を使用するRegExp
と、正規表現は文字列として扱われます。したがって、\
withをエスケープする必要があります\\
。/.../
フォームで使用する場合、そのエスケープは必要ありません。したがって、単純に の 2 番目を削除\
し\\
ます。
console.log(/^(0|1)\1{1,}$/.test("000"));
出力
true
\\1
にストリッピングして、この正規表現を試してください\1
:
/^(0|1)\1+$/.test("000");
String を使用してオブジェクトを構築するときはRegExp
、二重のエスケープが必要です。
を使用して正規表現を直接構築しているため、ここでは必要ありません/ and /