Заменить несколько символов в одном вызове на замену

Очень простой вопрос, но я не совсем понимаю, как это сделать.

Мне нужно заменить каждый экземпляр "_" пробелом, и каждый экземпляр "#" не имеет ничего/пустого.

var string = '#Please send_an_information_pack_to_the_following_address:';

Я пробовал это:

string.replace('#','').replace('_', ' ');

Я действительно не связываю такие команды, но есть ли другой способ сделать это в одном?

Ответ 1

Используйте оператор OR (|):

var str = '#this #is__ __#a test###__';
str.replace(/#|_/g,''); // result: "this is a test"

Вы также можете использовать класс символов:

str.replace(/[#_]/g,'');

Fiddle

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

String.prototype.allReplace = function(obj) {
    var retStr = this;
    for (var x in obj) {
        retStr = retStr.replace(new RegExp(x, 'g'), obj[x]);
    }
    return retStr;
};

console.log('aabbaabbcc'.allReplace({'a': 'h', 'b': 'o'}));
// console.log 'hhoohhoocc';

Почему бы не цеплять? Я не вижу в этом ничего плохого.

Ответ 2

Цепочка крута, зачем ее отклонять?

В любом случае, вот еще один вариант в одной замене:

string.replace(/#|_/g,function(match) {return (match=="#")?"":" ";})

Заменить будет выбрать ", если match ==" # "," " if not.

[Обновить] Для более общего решения вы можете сохранить ваши заменяющие строки в объекте:

var replaceChars={ "#":"" , "_":" " };
string.replace(/#|_/g,function(match) {return replaceChars[match];})

Ответ 3

Укажите флаг /g (глобальный) в регулярном выражении, чтобы заменить все совпадения вместо первого:

string.replace(/_/g, ' ').replace(/#/g, '')

Чтобы заменить один символ на одну вещь и другой символ на что-то еще, вы не можете обойтись, требуя двух отдельных вызовов replace. Вы можете абстрагировать его на функцию, как это делал Doorknob, хотя, вероятно, мне понадобится объект с старыми/новыми как пары ключ/значение вместо плоского массива.

Ответ 4

Если вы хотите заменить несколько символов, вы можете вызвать String.prototype.replace() с аргументом замены, являющимся функцией, которая String.prototype.replace() для каждого совпадения. Все, что вам нужно, это объект, представляющий сопоставление символов, которое вы будете использовать в этой функции.

Например, если вы хотите заменены a x, b с y и c с z, вы можете сделать что - то вроде этого:

var chars = {'a':'x','b':'y','c':'z'};
var s = '234abc567bbbbac';
s = s.replace(/[abc]/g, m => chars[m]);
console.log(s);

Выход: 234xyz567yyyyxz

Ответ 5

Вы также можете попробовать следующее:

function replaceStr(str, find, replace) {
    for (var i = 0; i < find.length; i++) {
        str = str.replace(new RegExp(find[i], 'gi'), replace[i]);
    }
    return str;
}

var text = "#here_is_the_one#";
var find = ["#","_"];
var replace = ['',' '];
text = replaceStr(text, find, replace);
console.log(text);

find ссылается на текст, который будет найден, и replace на текст, который нужно заменить на

Это будет замена символов, нечувствительных к регистру. Чтобы сделать иначе, просто измените флаги Regex по мере необходимости. Например: для чувствительной к регистру замены:

new RegExp(find[i], 'g')

Ответ 6

Вы можете просто попробовать это:

str.replace(/[.#]/g, 'replacechar');

это заменит., - и # на ваш replacechar!

Ответ 7

Пожалуйста, попробуй:

  • заменить несколько строк

    var str = "http://www.abc.xyz.com"; str = str.replace(/http:|www|.com/g, '');//str is "//.abc.xyz"

  • заменить несколько символов

    var str = "abcd,e,f,g,h"; str = str.replace(/[.,]/g, '');//str is "abcdefgh";

Удачи!

Ответ 8

Вы также можете передать объект RegExp методу replace, например

var regexUnderscore = new RegExp("_", "g"); //indicates global match
var regexHash = new RegExp("#", "g");

string.replace(regexHash, "").replace(regexUnderscore, " ");

Javascript RegExp

Ответ 9

Вот простой способ сделать это без RegEx.
Вы можете прототип и/или кешировать вещи по своему желанию.

// Example: translate( 'faded', 'abcdef', '123456' ) returns '61454'
function translate( s, sFrom, sTo ){
    for ( var out = '', i = 0; i < s.length; i++ ){
        out += sTo.charAt( sFrom.indexOf( s.charAt(i) ));
    }
    return out;
}

Ответ 10

yourstring = '#Please send_an_information_pack_to_the_following_address:';

замените '#' на '' и замените '_' пробелом

var newstring1 = yourstring.split('#').join('');
var newstring2 = newstring1.split('_').join(' ');

newstring2 - ваш результат

Ответ 11

Я не знаю, насколько это поможет, но я хотел удалить <b> и </b> из моей строки

поэтому я использовал

mystring.replace('<b>',' ').replace('</b>','');

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

Ответ 12

Вот еще одна версия с использованием String Prototype. Наслаждайтесь!

String.prototype.replaceAll = function(obj) {
    let finalString = '';
    let word = this;
    for (let each of word){
        for (const o in obj){
            const value = obj[o];
            if (each == o){
                each = value;
            }
        }
        finalString += each;
    }

    return finalString;
};

'abc'.replaceAll({'a':'x', 'b':'y'}); //"xyc"

Ответ 13

Вот функция "безопасного HTML", использующая функцию множественной замены "уменьшить" (эта функция применяет каждую замену ко всей строке, поэтому зависимости между заменами значительны).

// Test:
document.write(SafeHTML('<div>\n\
    x</div>'));

function SafeHTML(str)
    {
    const replacements = [
        {'&':'&amp;'},
        {'<':'&lt;'},
        {'>':'&gt;'},
        {'"':'&quot;'},
        {"'":'&apos;'},
        {''':'&grave;'},
        {'\n':'<br>'},
        {' ':'&nbsp;'}
        ];
    return replaceManyStr(replacements,str);
    } // HTMLToSafeHTML

function replaceManyStr(replacements,str)
    {
    return replacements.reduce((accum,t) => accum.replace(new RegExp(Object.keys(t)[0],'g'),t[Object.keys(t)[0]]),str);
    }