แทนที่อักขระหลายตัวในหนึ่งแทนที่การโทร


257

คำถามเล็ก ๆ น้อย ๆ ที่เรียบง่ายมาก แต่ฉันก็ไม่เข้าใจว่าจะทำอย่างไร

ฉันต้องการแทนที่ '_' ทุกอินสแตนซ์ด้วยช่องว่างและทุกอินสแตนซ์ของ '#' ด้วยไม่มีอะไรว่างเปล่า

var string = '#Please send_an_information_pack_to_the_following_address:';

ฉันเคยลองแล้ว:

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

ฉันไม่ชอบคำสั่งที่ผูกมัดแบบนี้ มีวิธีอื่นในการทำเช่นนี้หรือไม่?


ดูคำตอบสำหรับคำถามนี้: stackoverflow.com/questions/7072330/…
DeweyOx

คำตอบ:


515

ใช้ตัวดำเนินการ OR ( |):

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

ทำไมไม่ห่วงโซ่แม้ว่า? ฉันไม่เห็นอะไรผิดปกติ


นี่มันเจ๋ง แต่ฉันต้องแทนที่ขีดล่างด้วยช่องว่างที่ไม่ว่างฉันสามารถทำสิ่งนี้ได้หรือไม่?
Shannon Hochkins

คิดเช่นนั้น แต่ยังคงคุณได้ช่วยให้ฉันเข้าใจวิธีการเปลี่ยนสำนวนที่ทำงานได้ดีขึ้นเล็กน้อย :)
แชนนอน Hochkins

ต้นแบบของคุณไม่ทำงาน คุณสามารถที่จะให้เป็นตัวอย่างในซอผมให้ได้รับข้อผิดพลาด
แชนนอน Hochkins

3
ตัวเลือกอื่นสำหรับ#|_คือ[#_]และคุณอาจใช้+เพื่อจับคู่การแข่งขันติดต่อกันใด ๆ เพื่อปรับปรุงประสิทธิภาพ
Ian

3
ขอบคุณมาก ... ถ้าต้องการแทนที่ช่องว่างและสัญลักษณ์อื่นstr.replace(/[+ -]/g,'');เพียงแค่ใส่ช่องว่างตรงกลาง
equiman

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];})ทำให้การแก้ไข replaceChars ง่ายขึ้น
RozzA

@RozzA ขอบคุณ ในเวลานั้น Object.keys ไม่สำคัญ
Christophe

ฉันลืมเกี่ยวกับตัวเลือกฟังก์ชั่นการเปลี่ยนใหม่เพื่อแทนที่พารามิเตอร์ตัวที่สองเพื่อช่วยให้ฉันจดจำ :)
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);
Felix Geenen

1
@FelixGeenen 1. คุณฆ่า portability 2. ถ้าคุณเลือก redefine chars หรือ s, คุณจะได้รับ error runtime ซึ่งฆ่ามัน 'ความทนทาน', 3. ไม่มีหมายจับที่จะปกป้อง s จากการกลายพันธุ์และ rebinding อื่น ๆ ที่ไม่ใช่อุดมการณ์บริสุทธิ์ มันเป็นสิ่งที่ยอดเยี่ยมที่จะเห็นว่าตัวอย่างนี้จะยังคงทำงานใน 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);
Dmitry

มันดีจริงๆ ขอบคุณ ส่วนใดที่คุณใช้วัตถุเพื่อทำคำสั่งหรือ คุณมีเอกสารหรือการอ้างอิงถึงสิ่งที่อธิบายว่า กรณีการใช้งานที่ดีงาม
Christian Matthew

39

ระบุการ/gตั้งค่าสถานะ (global) ในนิพจน์ทั่วไปเพื่อแทนที่การแข่งขันทั้งหมดแทนที่จะเป็นเพียงรายการแรก:

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

replaceเพื่อแทนที่ตัวละครตัวหนึ่งที่มีสิ่งหนึ่งและตัวละครที่แตกต่างกันกับบางสิ่งบางอย่างอื่นคุณไม่สามารถจริงๆได้รับรอบสองสายที่ต้องแยกจากกันเพื่อ คุณสามารถสรุปมันลงในฟังก์ชั่นตามที่ Doorknob ทำได้แม้ว่าฉันอาจจะใช้วัตถุที่มีคู่เก่า / ใหม่เป็นคู่คีย์ / ค่าแทนอาร์เรย์แบบแบน


ฉันจะรวมแฮชด้วยได้อย่างไร
Shannon Hochkins

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

สิ่งนี้จะแทนที่, - และ # ด้วย replacechar ของคุณ!


คำตอบนี้ได้รับการจัดเตรียมไว้แล้วและไม่รองรับการแทนที่อักขระอื่นด้วยอักขระอื่น ๆ โปรดดู OP
แชนนอน Hochkins

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

ฉันรู้ว่าคุณไม่ได้ระบุไว้ แต่มันไม่สวยงามกว่าการใช้ regex ใช่ไหม str.replace(/#|_/g,'')
Shannon Hochkins

1
@ShannonHochkins แน่นอน! ฉันไม่ได้ตั้งใจจะทุบตี RegEx ฉันแค่แสดงตัวเลือกอื่น RegEx ไม่ได้ใช้งานง่ายและให้ยืมตัวเองเพื่อใช้ "เป็นค้อนรักษาทุกปัญหาเป็นเล็บ" บวกกับการดูคำตอบอื่น ๆ เนื่องจากฟังก์ชั่นที่ใช้ซ้ำได้อันนี้ไม่ได้มีความยาวมากนักและพารามิเตอร์นั้นเข้าใจได้ง่าย โดยส่วนตัวฉันจะไปกับ RegEx สั้น ๆ สำหรับคำถามที่นี่และมันสมเหตุสมผลถ้าคุณแค่มองหาตัวอย่างแบบดรอปดาวน์อย่างรวดเร็วที่คุณไม่รังเกียจที่จะไม่เข้าใจอย่างสมบูรณ์
Beejor

ถ้าคุณจำเป็นต้องแปลอักขระ ( คำสั่งà la sed yหรือà la Unix tr) ดูเหมือนจะเป็นคำตอบที่ถูกต้อง
Édouard

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


OP ไม่ต้องการเชื่อมโยงreplaceสาย - สิ่งนี้ไม่ได้ช่วยหลีกเลี่ยงสิ่งนั้น
เดนนิส

2

yourstring = '#Please send_an_information_pack_to_the_following_address:';

แทนที่ '#' ด้วย '' และแทนที่ '_' ด้วยช่องว่าง

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

newstring2 คือผลลัพธ์ของคุณ


คำตอบของคุณไม่ได้ใช้ jQuery ที่ฉีกขาดและยังไม่ติดตาม OP, '#this #is__ #a ทดสอบ ### ' .split ('_') นี้เข้าร่วม ('') จะไม่ทำงานเหมือน คุณจะจบลงด้วยพื้นที่ว่างมากขึ้น
Shannon Hochkins

@ShannonHochkins พื้นที่สีขาวจะถูกเพิ่มอีกเท่าไหร่?
Hafsul Maru

ดูตัวอย่างของฉันเมื่อมีขีดล่างก่อนช่องว่างหรือสองขีดล่างคุณจะจบลงด้วยช่องว่างหลายช่อง
Shannon Hochkins

@ShannonHochkins ผู้ถามเกี่ยวข้องกับสตริง '#Please send_an_information_pack_to_the_following_address:'; ที่นี่ไม่มีที่ว่าง ทำไมฉันถึงคิดถึงมัน เมื่อคิดว่าทำไมเกี่ยวกับพื้นที่เท่านั้นสิ่งอื่น ๆ อาจเกิดขึ้น
Hafsul Maru

ฉันขอแนะนำให้คุณอ่าน OP ฉันเป็นโปสเตอร์ต้นฉบับและคุณสามารถเห็นได้อย่างชัดเจนในตัวแปรแรกของฉันvar str = '#this #is__ __#a test###__';ว่ามีช่องว่างหลายจุดในสตริงนี้
Shannon Hochkins

2

นี่เป็นอีกเวอร์ชั่นที่ใช้ 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"

1

ฉันไม่รู้ว่ามันจะช่วยได้มากแค่ไหน แต่ฉันต้องการที่จะลบ<b>และออก</b>จากสายของฉัน

ดังนั้นฉันใช้

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

ดังนั้นโดยทั่วไปถ้าคุณต้องการลดจำนวนอักขระที่ จำกัด และไม่ต้องเสียเวลานี่จะเป็นประโยชน์


-1

นี่คือฟังก์ชั่น "safe 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);
    }

ขอบคุณสำหรับการโพสต์ แต่มันค่อนข้างกว้างขวางเมื่อเทียบกับคำตอบที่ยอมรับ
Shannon Hochkins

คำตอบสำหรับคำถามคือฟังก์ชั่นหนึ่งบรรทัด "กว้างขวาง" เป็นอย่างไร? การทำให้การป้อนข้อมูลของผู้ใช้ปลอดภัยเป็นตัวอย่างที่สำคัญ คุณสำคัญเกินไป 'ลด' เป็นเทคนิคที่มีประโยชน์มากที่คุณควรรู้
David Spector

ฉันบอกว่าคำตอบของคุณกว้างเกินไปมันเป็นรหัสมากกว่าคุณกำลังใช้การแสดงออกปกติอยู่แล้วแค่ทำให้ขั้นตอนซับซ้อนเกินไปไม่แน่ใจว่าคุณคิดว่าคำตอบของคุณลดลงเมื่อเทียบกับคำตอบเหล่านี้ ...
Shannon Hochkins

คำตอบของฉันคือคำตอบ 'ลด' เพราะใช้ฟังก์ชัน Array.prototype.reduce คำตอบที่สั้นกว่าอาจใช้สตริงแทนคีย์คุณสมบัติโดยใช้ประโยชน์จากความจริงที่ว่าฟังก์ชั่น "safe HTML" นั้นใช้งานได้กับการแทนที่อักขระเดี่ยวเท่านั้น ฉันขอท้าให้คุณหาคำตอบที่สง่างามกว่าแทนที่จะบ่นอย่างหยาบคายในที่สาธารณะเช่นนี้
David Spector

ที่จริงฉันพูดขอบคุณแล้วให้คำวิจารณ์คุณเอามันมาและตัดสินใจที่จะเขียนอะไรบางอย่างที่น่ารังเกียจกลับมาถ้าเราจะเริ่มด้วยวิธีการทำงานเพื่อทำหน้าที่แทนการล่ามโซ่แบบที่เราควรจะเป็นแล้วสิ่งที่ง่ายกว่า: jsfiddle .net / shannonhochkins / xsm9j610 / 21
Shannon Hochkins
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.