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


256

Дуже просте невелике запитання, але я не зовсім розумію, як це зробити.

Мені потрібно замінити кожен екземпляр "_" пробілом, а кожен екземпляр "#" - нічого / порожнім.

var string = '#Please send_an_information_pack_to_the_following_address:';

Я спробував це:

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

Мені не дуже подобаються такі ланцюжки команд. Чи є інший спосіб зробити це одним?


Дивіться відповідь на це питання: stackoverflow.com/questions/7072330 / ...
DeweyOx

Відповіді:


513

Використовуйте оператор АБО ( |):

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

Ви також можете використовувати клас символів:

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

Скрипка

Якщо ви хочете замінити хеш на одне, а підкреслення - на інше, тоді вам просто доведеться зав'язати ланцюжок. Однак ви можете додати прототип:

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';

Чому б не ланцюг, хоча? Я не бачу в цьому нічого поганого.


Це круто, але мені потрібно замінити підкреслення пробілами, не порожніми, чи можу я це зробити?
Шеннон Хочкінс

Думав так, але все ж ви допомогли мені зрозуміти, як замінити вирази працюють трохи краще :)
Шеннон Хочкінс

Ваш прототип не працює? чи можете ви надати приклад на скрипці, я продовжую отримувати помилки
Шеннон Хочкінс

3
Інший варіант #|_це [#_], і ви можете також використовувати +для відповідності будь-яких матчів поспіль , щоб поліпшити продуктивність
Ian

3
Класна подяка ... якщо потрібно замінити порожні пробіли та інші символи, str.replace(/[+ -]/g,'');просто поставте порожній пробіл посередині.
еквіман

53

Ланцюг - це круто, навіщо його звільняти?

У будь-якому випадку, тут є ще один варіант в одній заміні:

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

Заміна вибере "" якщо збіг == "#", "" якщо ні.

[Оновлення] Для отримання більш загального рішення ви можете зберігати замінні рядки в об'єкті:

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

4
скористайтеся додатковим кроком: var regex = new RegExp( Object.keys(replaceChars).join("|"), "g"); string.replace(regex,function(match) {return replaceChars[match];})це полегшує зміну заміниChars.
RozzA

@RozzA спасибі На той час Object.keys не був мейнстрімом.
Крістоф

Я повністю забув про параметр функції заміни другого параметра, що допомагає мені запам'ятати :)
Luckylooke

48

Якщо ви хочете замінити кілька символів, ви можете зателефонувати до 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


3
так як ви використовуєте ES6 (стрілка функції) , ви також повинні замінити varз constтут. альтернатива розширеній підтримці браузера:var s ='234abc567bbbbac'; s = s.replace(/[abc]/g, function(m) { return {'a':'x','b':'y','c':'z'}[m]; }); console.log(s);
Фелікс Генен

1
@FelixGeenen 1. ви вбиваєте портативність 2. якщо ви вирішите переосмислити символи або s, ви отримаєте помилку виконання, яка вбиває її "надійність", 3. немає жодного ордера на захист s від мутації та перезавантаження, окрім суто ідеологічних. Чудово бачити, що цей фрагмент все ще працюватиме в щойно встановленому Windows98 при подвійному клацанні / cscript / wscript:var chars = {a:'1', b:'2', c:'3'}; var s = '123abc123'; var u = s.replace(/[abc]/g, function(m) { return chars[m]; }); WScript.echo(u);
Дмитро

це справді добре. Дякую. Яка частина, де ви використовували об'єкт для створення або заяви. чи є у вас документація чи посилання на щось, що пояснює це. Досить вдалий випадок використання.
Крістіан Матвій

39

Вкажіть /g(глобальний) прапор у регулярному виразі, щоб замінити всі збіги замість лише першого:

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

Щоб замінити одного персонажа одним, а іншого символу чимось іншим, вам реально не обійтись, потребуючи двох окремих дзвінків replace. Ви можете абстрагувати його як функцію, як це зробив Doorknob, хоча, мабуть, я б змусив його взяти об’єкт зі старим / новим як пари ключів / значень замість плоского масиву.


як би я включив хеш?
Шеннон Хочкінс

4

Ви також можете спробувати це:

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')

4

Ви можете просто спробувати це:

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

це замінить., - і # вашим замінником!


Ця відповідь вже надана і не справляється із заміною різних символів іншими символами, див. ОП.
Шеннон Хочкінс

3

Ось простий спосіб зробити це без 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;
}

Я знаю, що ви цього не заявляли, але чи не набагато елегантніше просто використовувати регулярний вираз? str.replace(/#|_/g,'')
Шеннон Хочкінс

1
@ShannonHochkins Напевно! Я не хочу бавитись на RegEx; Я просто показую інший варіант. RegEx не завжди інтуїтивно зрозумілий, і він може бути використаний "як молоток, розглядаючи кожну проблему як цвях". Плюс дивлячись на інші відповіді, як функція багаторазового використання ця функція не набагато більш тривала, а параметри легко зрозуміти. Особисто я б пішов з коротким RegEx для питання тут, і це має сенс, якщо ви просто шукаєте швидкий фрагмент, що випадає, який ви не заперечуєте, щоб не повністю зрозуміти.
Beejor

Ну, якщо вам потрібно перекласти символи ( команда à la sed y або à la Unix tr), це здається правильною відповіддю.
Едуард

3

Будь ласка, спробуй:

  • замінити кілька рядків

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

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

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

Удачі!


2

Ви також можете передати об’єкт RegExp такому способу заміни, як

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

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

Javascript RegExp


ОП не хоче передавати replaceдзвінки - це не допомагає цього уникнути.
Денніс

2

yourstring = '# Будь ласка, send_an_information_pack_to_the_following_address:';

замініть "#" на "" і замініть "_" пробілом

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

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


Ваша відповідь не використовує клаптиків jQuery, а також не відповідає OP, '#this #is__ #a test ### ' .split ('_'). Join ('') не працюватиме як ви закінчите більше пробілів
Шеннон Хочкінс

@ShannonHochkins Як додано ще пробілів?
Хафсул Мару

Подивіться на мій приклад, коли перед пробілом є підкреслення, або два підкреслення, у вас вийде кілька пробілів.
Шеннон Хочкінс

@ShannonHochkins запитуючий вирішує рядок "#Please send_an_information_pack_to_the_following_address: '; місця тут немає. чому я буду думати про це. коли думаєш, чому тільки про космос, може статися багато іншого.
Хафсул Мару

Я пропоную вам прочитати ОП, я - оригінальний плакат, і ви можете чітко бачити в моїй першій змінній, var str = '#this #is__ __#a test###__';що в цьому рядку є чіткі кілька пробілів
Шеннон Хочкінс

2

Ось ще одна версія з використанням прототипу String. Насолоджуйтесь!

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"

1

Я не знаю, наскільки це допоможе, але я хотів видалити <b>і </b>зі свого рядка

тому я звик

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

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


-1

Ось функція "безпечного 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);
    }

Дякую за пост, проте він досить обширний порівняно з прийнятою відповіддю
Шеннон Хочкінс

Відповідь на питання - це однолінійна функція. Як це "обширне"? Зробити безпечний ввід користувача важливим прикладом. Ви занадто критичні. "зменшити" - це дуже корисна техніка, про яку слід знати.
Девід Спектор

Я сказав, що ваша відповідь занадто обширна, це набагато більше коду, ви все одно використовуєте регулярні вирази, просто роблячи процес занадто перекрученим, не впевнений, як ви вважаєте, що ваша відповідь є зменшенням порівняно з будь-яким із цих відповідей ...
Шеннон Хочкінс

Моя відповідь - відповідь "зменшити", оскільки вона використовує функцію Array.prototype.reduce. Коротша відповідь може використовувати рядок замість ключів властивості, використовуючи той факт, що функція "безпечного HTML" працює лише на заміну окремих символів. Я закликаю вас придумати більш елегантну відповідь, а не грубо скаржитися на публіку, як це.
Девід Спектор

Насправді я сказав вам подяку, і я піддав вам критику, ви прийняли це і вирішили написати щось зворотне, якщо ми почнемо з функціональних методів виконувати, а не прототипічно приковані методи, як ми повинні бути, то щось набагато простіше на зразок: jsfiddle .net / shannonhochkins / xsm9j610 / 21
Шеннон Хочкінс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.