0

次の式があります: ^(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");   
4

3 に答える 3

5

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
于 2013-11-13T13:12:42.463 に答える
1

を使用するRegExpと、正規表現は文字列として扱われます。したがって、\withをエスケープする必要があります\\/.../フォームで使用する場合、そのエスケープは必要ありません。したがって、単純に の 2 番目を削除\\\ます。

console.log(/^(0|1)\1{1,}$/.test("000"));

出力

true
于 2013-11-13T13:12:51.443 に答える
1

\\1にストリッピングして、この正規表現を試してください\1:

/^(0|1)\1+$/.test("000");

String を使用してオブジェクトを構築するときはRegExp、二重のエスケープが必要です。

  1. 1st by String オブジェクト
  2. 正規表現エンジンによる2位

を使用して正規表現を直接構築しているため、ここでは必要ありません/ and /

于 2013-11-13T13:12:51.903 に答える