如何使用数组删除字符串的一部分

我想删除(技术上替换)单词int, float, char, bool, main, void main, int main, cout, cin"" (如删除它)如果在字符串上找到它。

所以,如果我有ff:

 str = "void main(){ couts<<"wrong"; cout<<"right"; }" 

更换后,它应该是:

 str = "(){ (); couts<<"wrong"; <<"right"; }" 

单词int,float,char,bool,main …等存储在数组中

 kWord[0] = /int/ kWord[1] = /float/ kWord[2] = /char/ kWord[3] = /bool/ kWord[4] = /main/ kWord[5] = /void\s+main/ kWord[6] = /int\s+main/ kWord[7] = /cout/ kWord[8] = /cin/ 

这与我之前的问题有关如何以最快的方式删除字符串的一部分,但这次单词在Array中

您可以在回答其他问题时执行相同操作,但使用kWord.join(’|’)构建正则表达式对象。

 kWord[0] = 'int'; kWord[1] = 'float'; kWord[2] = 'char'; kWord[3] = 'bool'; kWord[4] = 'main'; kWord[5] = 'void\\s+main'; kWord[6] = 'int\\s+main'; kWord[7] = 'cout'; kWord[8] = 'cin'; var r = '\\b(' + kWord.join('|') + ')\\b'; var myRegex = new RegExp(r, 'g'); str = str.replace(myRegex, ""); 
 for(int i=0; i 

当然这也会将主机转换为帧,整数转换为eger等。它也不会触及所有出现,只是第一次出现。 如果你需要避免像这样的子串,你可能需要更多考虑它,并使用一个检查字边界的正则表达式

 /\bfoo\b/g 

您必须在kWord为每个正则表达式添加g标志

 // eg, kWord[0] = /int/g; 

然后这应该工作

 for (var i=0, len=kWord.length; i 

编辑此解决方案已经过编辑,以适应零宽度字边界的匹配

如果您没有(或不能)将g标志添加到每个正则表达式,则必须执行此操作

 for (var i=0, len=kWord.length; i 

说明:

如果你有一个现有的regexp, var re = /foo/ ,那么在str.replace调用时就无法将额外的标志传递给正则表达式。 但是,您可以动态构建新的正则表达式。

 var re2 = new RegExp("foo", "g"); //=> /foo/g 

现在我们可以轻松地重建现有的正则表达式,使用re.source添加g标志

 var re = /foo/; var re2 = new RegExp(re.source, "g"); //=> /foo/g 

其他问题:

正如一位评论者指出的那样,你的一些regexen将不会像你定义的那样完全表现。 添加零宽度\b检查一些关键字将有助于/\bint\b/不匹配“我的亚洲眼睛是眯缝”而/int/ (无效)会。