我必须计算数组的每个字符串(元素)中列表(变量“模式”)中符号的出现次数。我想通过在变量中设置模式来使其更加通用。但是,当我尝试使用 RegExp 对象来做到这一点时,它不起作用。
我无法理解两部分代码的区别:
此变体不起作用。
var pattern = "@#%";
var arr = ['T@wn','D#nse Cr%wd','Cr#m#n#l M@st@m@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 = ['T@wn','D#nse Cr%wd','Cr#m#n#l M@st@m@nd'];
for(var i=0; i < arr.length; i++){
console.log(arr[i].replace(/[^@#%]/gi,"").length);
}
结果将是:
1
2
6
你能解释一下其中的区别吗?
提前致谢。
请您参考如下方法:
var pattern = "@#%";
var arr = ['T@wn','D#nse Cr%wd','Cr#m#n#l M@st@m@nd'];
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 + ']';
删除周围的 /
,因为您将正则表达式模式作为 string
传递给 RegExp
构造函数。
Mozilla says关于这两种类型:
You construct a regular expression in one of two ways:
Using a regular expression literal, which consists of a pattern enclosed between slashes, as follows:
var re = /ab+c/;
Regular expression literals provide compilation of the regular expression when the script is loaded. When the regular expression will remain constant, use this for better performance.
Or calling the constructor function of the RegExp object, as follows:
var re = new RegExp("ab+c");