如何使用数组删除字符串的一部分
我想删除(技术上替换)单词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/
(无效)会。