2013-08-28 3 views
0

Я хочу удалить (технически заменить) слова int, float, char, bool, main, void main, int main, cout, cin в "" (например, удалить его), если он найден на строке.Как удалить часть строки с помощью массивов

Так что, если у меня есть ФФ:

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

После замены, он должен быть:

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

слова INT, поплавок, голец, BOOL, главный ... и т.д., которые хранятся в массив

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/ 

Это связан с моим предыдущим вопросом How to remove a part of the string the fastest way, но на этот раз слово в Массив

+2

Не уверен, что мне здесь не хватает, но кажется, что вы можете перебирать ваш массив и выполнять '.replace()' в строке для каждого индекса в массиве. Или просто создайте один RegExp со всеми словами. – Jasper

+1

Если массив содержит строки, вы можете превратить его в одно регулярное выражение с помощью var var = new RegExp ('\ b (' + kWord.join ('|') + '\ b')); '. Но если они уже представляют собой регулярные выражения, вы можете просто пропустить их. Но им нужны '\ b' на концах и модификаторы' g'. – Barmar

+0

help: kWord [9] = /! String!/Не заменяется .. –

ответ

0

Вы можете сделать то же самое, как и в ответ на ваш other question, но здание объект регулярных выражений с использованием 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, ""); 
+0

он выглядит аккуратно и правильно, но его не работает в моем коде –

+0

его работая сейчас, я просто пропустил что-то спасибо –

+1

@fireflieslive использует примечание '[el1, el2, el3, ...]' вместо 'kWord = [] ; wWord [0] = el1; ... '. Кроме того, если вы планируете часто выполнять замену, не забудьте постоянно воссоздавать новый объект RegExp. – plalx

1

Вы должны добавить g флаг каждого регулярного выражения в kWord

// e.g., 
kWord[0] = /int/g; 

Тогда это должно работать

for (var i=0, len=kWord.length; i<len; i++) { 
    str = str.replace(kWord[i], ''); 
} 

EDIT это решение было отредактировано для размещения для сопоставления границ слов с нулевой шириной

Если вы (или не может) добавить g флаг каждого регулярного выражения, вы должны сделать это

for (var i=0, len=kWord.length; i<len; i++) { 
    var b = "\\b", 
     re = new RegExp(b + kWord[i].source + b, 'g'); 
    str = str.replace(re, ''); 
} 

Объяснение:

Если существующий regexp, var re = /foo/, нет способа передать дополнительные флаги регулярному выражению во время вызова str.replace. Однако вы можете создавать новое регулярное выражение динамически.

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

Теперь мы можем легко восстановить нашу существующую регулярному_выражению добавить g флаг, используя re.source

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

Дополнительные проблемы:

Как комментатор указывает на то, некоторые ofyour regexen не будут выполняться так, как вы их определили. Добавление нулевой ширины \b проверок некоторых ваших ключевых слов поможет таким вещам, как /\bint\b/, из-за несоответствия «Мои азиатские глаза косоглазие», тогда как /int/ (недействительно).

+1

как насчет \ b? как в http://stackoverflow.com/questions/18495638/how-to-remove-a-part-of-the-string-the-fastest-way/18495747?noredirect1_18495791 –

+0

@fireflieslive спасибо за обзор. Я добавил комментарий. – naomik

+0

Ваш ответ правильный, и вы объяснили это мне хорошо, но я должен выбрать ответ Tap, потому что он опрятен и ближе к моему предыдущему вопросу. ^^ –

1
for(int i=0; i<kWord.length; i++) { 
    str = str.replace(kWord[i],""); 
} 

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

/\bfoo\b/g 
+0

Это не изменяет исходную 'str', а также не адресует флаг' g'. – naomik

+0

Недопустимо говорить: «Вам не нужны регулярные выражения вообще. Вы можете просто поместить исходные строки», когда некоторые из них явно требуют их. – naomik

+0

@naomik хорошая точка, не смотрел достаточно внимательно на список слов. лучше? –

Смежные вопросы