Bir değiştirme çağrısında birden fazla karakteri değiştirme


258

Çok basit küçük bir soru, ama nasıl yapılacağını tam olarak anlamıyorum.

'_' Her örneğini bir boşluk ve '#' her örneğini hiçbir şey / boş ile değiştirmem gerekiyor.

var string = '#Please send_an_information_pack_to_the_following_address:';

Bunu denedim:

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

Zincirleme gibi komutları gerçekten sevmiyorum. Birinde yapmanın başka bir yolu var mı?


Bu sorunun cevabına bakınız: stackoverflow.com/questions/7072330/…
DeweyOx

Yanıtlar:


517

VEYA operatörünü ( |) kullanın :

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

Ayrıca bir karakter sınıfı da kullanabilirsiniz:

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

Vaktini boşa harcamak

Eğer hash'ı bir şeyle ve alt çizgiyi başka bir şeyle değiştirmek istiyorsanız, sadece zincirlemeniz gerekecektir. Ancak, bir prototip ekleyebilirsiniz:

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

Neden zincir olmasın? Bunda hiçbir yanlışlık görmüyorum.


Bu harika, ama alt çizgileri boş olmayan boşluklarla değiştirmem gerekiyor, bunu yapabilir miyim?
Shannon Hochkins

Öyle düşündüm, ama yine de ifadelerin yerini
almanın

Prototipiniz çalışmıyor mu? keman üzerinde bir örnek verebilir misiniz, ben hata almaya devam
Shannon Hochkins

3
İçin başka bir seçenek #|_olduğunu [#_]ve sizin de kullanabilir +performansını artırmak için herhangi ardışık eşleşmeleri eşleştirmek için
Ian

3
Serin teşekkürler ... gerekirse boşlukları değiştirin ve başka bir sembol str.replace(/[+ -]/g,'');sadece ortada boş alan koyun.
equiman

53

Zincirleme harika, neden reddediyorsun?

Her neyse, işte bir değiştirmede başka bir seçenek var:

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

Değiştirme, "= if match ==" # "," "değilse seçer.

[Güncelleme] Daha genel bir çözüm için, yedek dizelerinizi bir nesnede saklayabilirsiniz:

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

4
ekstra adım atın: var regex = new RegExp( Object.keys(replaceChars).join("|"), "g"); string.replace(regex,function(match) {return replaceChars[match];})replaceChars'ın değiştirilmesini kolaylaştırır.
RozzA

@RozzA teşekkürler. Object.keys o sırada ana akım değildi.
Christophe

Tamamen hatırlamama yardımcı olmak için ikinci parametreyi değiştirmek için değiştirme fonksiyonu seçeneğini unuttum :)
Luckylooke

48

Birden fazla karakteri değiştirmek isterseniz, String.prototype.replace()her bir eşleşme için çağrılan bir işlev olan yedek argümanıyla çağrı yapabilirsiniz . Tek ihtiyacınız olan, bu işlevde kullanacağınız karakter eşlemesini temsil eden bir nesnedir.

Örneğin , onunla ve onunla adeğiştirmek istiyorsanız, bunun gibi bir şey yapabilirsiniz:xbycz

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

Çıktı :234xyz567yyyyxz


3
ES6 (ok işlevi) kullandığınızdan var, constburada da değiştirmelisiniz . genişletilmiş tarayıcı desteği için bir alternatif:var s ='234abc567bbbbac'; s = s.replace(/[abc]/g, function(m) { return {'a':'x','b':'y','c':'z'}[m]; }); console.log(s);
Felix Geenen

1
@FelixGeenen 1. taşınabilirliği öldürürsünüz 2. karakterleri veya karakterleri yeniden tanımlamayı seçerseniz, 'sağlamlığını öldüren bir çalışma zamanı hatası alırsınız. Bu snippet'in hala çift tıklama / cscript / wscript üzerinde yeni kurulmuş windows98'de çalışacağını görmek harika bir şey: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);
Dmitry

bu gerçekten iyi. Teşekkürler. Bir nesneyi veya deyimini yapmak için kullandığınız bölüm nedir. bunu açıklayan bir dokümanınız veya referansınız var mı? Oldukça iyi kullanım durumu.
Christian Matthew

39

/gSadece birincisi yerine tüm eşleşmeleri değiştirmek için normal ifadede (global) bayrağı belirtin :

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

Bir karakteri bir şeyle, farklı bir karakteri başka bir şeyle değiştirmek için, iki ayrı çağrıya gerçekten ihtiyaç duyamazsınız replace. Doorknob'un yaptığı gibi bir fonksiyona soyutlayabilirsiniz, ancak muhtemelen eski / yeni bir nesneyi düz bir dizi yerine anahtar / değer çiftleri olarak almam gerekirdi.


hash'ı nasıl dahil edebilirim?
Shannon Hochkins

4

Bunu da deneyebilirsiniz:

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, bulunacak replacemetni ve değiştirilecek metni ifade eder

Bu, büyük / küçük harfe duyarlı olmayan karakterlerin yerini alacaktır. Başka türlü yapmak için Regex bayraklarını gerektiği gibi değiştirin. Örneğin: büyük / küçük harfe duyarlı değiştirme için:

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

4

Bunu sadece deneyebilirsiniz:

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

bu., - ve # yerine replacechar!


Bu yanıt zaten verilmiştir ve farklı karakterlerin diğer karakterlerle değiştirilmesiyle ilgilenmez, bkz. OP.
Shannon Hochkins

3

İşte RegEx olmadan yapmanın basit bir yolu.
Bir şeyleri istediğiniz gibi prototipleyebilir ve / veya önbelleğe alabilirsiniz.

// 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;
}

Belirtmediğini biliyorum, ama sadece normal ifadeyi kullanmak çok daha zarif değil mi? str.replace(/#|_/g,'')
Shannon Hochkins

1
@ShannonHochkins Kesinlikle! RegEx bash demek istemiyorum; Sadece başka bir seçenek gösteriyorum. RegEx her zaman sezgisel değildir ve kendisini "çekiç olarak kullanmak, her problemi çivi gibi ele almak" için verir. Ayrıca diğer cevaplara bakıldığında, yeniden kullanılabilir bir fonksiyon olarak bu çok daha uzun değildir ve parametrelerin anlaşılması kolaydır. Şahsen burada soru için kısa bir RegEx ile giderdim ve sadece tam olarak anlamamanın sakıncası olmayan hızlı bir açılır snippet arıyorsanız, mantıklı.
Beejor

Bir karakteri çevirmeniz gerekiyorsa (à la sed y command veya à la Unix tr), bu doğru cevap gibi görünüyor.
Édouard

3

Deneyin lütfen:

  • çoklu dizeyi değiştir

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

  • çoklu karakterleri değiştir

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

İyi şanslar!


2

Ayrıca RegExp nesnesini replace yöntemine iletebilirsiniz.

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

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

Javascript RegExp


OP replacearamaları zincirlemek istemez - bu bundan kaçınmaya yardımcı olmaz.
Dennis

2

yourstring = '#Lütfen gönderin_an_information_pack_to_the_following_address:';

'#' yerine '' yerine '_' yerine boşluk koyun

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

newstring2 senin sonucun


Cevabınız bir jQuery parçası kullanmıyor ve aynı zamanda OP'yi takip etmiyor, '#this #is__ #a test ### ' .split ('_'). Join ('') şu şekilde çalışmaz daha fazla boşlukla karşılaşırsınız
Shannon Hochkins

@ShannonHochkins Daha fazla beyaz alan nasıl eklenecek?
Hafsul Maru

Örneğime bir bakın, bir boşluktan önce bir alt çizgi olduğunda veya iki alt çizgiyle birden çok boşluk elde edersiniz.
Shannon Hochkins

@ShannonHochkins soru soran kişi '#Please send_an_information_pack_to_the_following_address:' dizesiyle ilgilenir. burada yer yok. neden düşüneceğim. düşündüğünüzde, neden sadece alan hakkında, başka şeyler de olabilir.
Hafsul Maru

OP'yi okumanızı tavsiye ederim, orijinal posterim ve ilk değişkenimde var str = '#this #is__ __#a test###__';bu dizede açıkça birden fazla boşluk olduğunu açıkça görebilirsiniz .
Shannon Hochkins

2

İşte String Prototype kullanan başka bir sürüm. Zevk almak!

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

Bu yardımcı olacaktır ne kadar olursa bilmiyorum ama kaldırmak istedim <b>ve </b>benim dizesinden

bu yüzden kullandım

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

bu yüzden temelde sınırlı sayıda karakterin azaltılmasını ve zaman kaybetmemesini istiyorsanız bu yararlı olacaktır.


-1

Burada, 'azaltma' çoklu değiştirme işlevini kullanan bir "güvenli HTML" işlevi vardır (bu işlev, her bir dizeyi tüm dizeye uygular, bu nedenle değiştirmeler arasındaki bağımlılıklar önemlidir).

// 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);
    }


Sorunun cevabı tek satırlık bir fonksiyondur. Bu nasıl "kapsamlı"? Kullanıcı girişini güvende tutmak önemli bir örnektir. Çok kritiksiniz. 'azaltma' bilmeniz gereken çok faydalı bir tekniktir.
David Spector

Cevabınızın çok geniş olduğunu söyledim, çok daha fazla kod, yine de düzenli ifadeler kullanıyorsunuz, sadece süreci çok kıvrımlı hale getiriyorsunuz, cevabınızın bu cevaplardan herhangi birine kıyasla nasıl bir azalma olduğunu düşündüğünüzden emin değilim ...
Shannon Hochkins

Cevabım Array.prototype.reduce işlevini kullandığı için 'azaltma' yanıtıdır. Daha kısa bir yanıt, özellik anahtarları yerine bir dize kullanabilir ve "güvenli HTML" işlevinin yalnızca tek karakterlerin değiştirilmesi üzerinde çalıştığı gerçeğinden yararlanabilir. Bu tür kamuoyunda kaba bir şekilde şikayet etmek yerine daha şık bir cevap bulmanız için size meydan okuyorum.
David Spector

Aslında teşekkür ederim dedim ve size eleştiri verdiniz, bunu aldınız ve sinsi bir şey yazmaya karar verdiniz, eğer olması gerektiği gibi prototip zincirleme yöntemlerden ziyade işlevsel yöntemlerle başlayacaksak, o zaman çok daha basit bir şey: jsfiddle .net / shannonhochkins / xsm9j610 / 21
Shannon Hochkins
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.