2016-06-29 5 views
0

Мне нужно подсчитать количество символов из списка (var. "Pattern") в каждой строке (элементе) массива. Я хочу сделать его более универсальным, установив шаблон в переменной. Но, когда я пытаюсь сделать это с помощью объекта RegExp, он не работает.javascript regex object vs inline regex

Я не могу понять разницу в двух частях кода:

Этот вариант не работает.

var pattern = "@#%"; 
var arr = ['[email protected]','D#nse Cr%wd','Cr#m#n#l [email protected][email protected]@nd']; 

for(var i=0; i < arr.length; i++){ 
l = '/[^'+pattern+']/'; 
g = new RegExp(l,"gi"); 
console.log(arr[i].replace(g,"").length); 
} 

Результат будет:

4 
11 
18 

Тот же вариант, но без объекта RegExp, работает отлично:

var arr = ['[email protected]','D#nse Cr%wd','Cr#m#n#l [email protected]@[email protected]']; 

for(var i=0; i < arr.length; i++){ 
console.log(arr[i].replace(/[^@#%]/gi,"").length); 
} 

Результат будет:

1 
2 
6 

Вы можете объяснить разницу?

Заранее спасибо.

ответ

1

var pattern = "@#%"; 
 
var arr = ['[email protected]','D#nse Cr%wd','Cr#m#n#l [email protected]@[email protected]']; 
 

 
for(var i=0; i < arr.length; i++){ 
 
l = '[^' + pattern + ']'; 
 
g = new RegExp(l, "gi"); 
 
console.log(arr[i].replace(g,"").length); 
 
}

Эта линия должна быть изменена:

l = '/[^' + pattern + ']/'; 

к:

l = '[^' + pattern + ']'; 

удаления окружающих /, потому что вы передаете в шаблоне регулярного выражения, как a string в конструктор RegExp.

Mozilla says об этих двух типов:

Вы построить регулярное выражение в одном из двух способов:

Используя литерал регулярного выражения, которое состоит из шаблона , заключенной между косой черты, следующим образом:

var re = /ab+c/; 

литералы регулярных выражений обеспечивают компиляцию регулярное выражение, когда экр Загружается ipt. Когда регулярное выражение останется постоянным, используйте его для повышения производительности.

Или вызов функции конструктора объекта RegExp, следующим образом:

var re = new RegExp("ab+c");