วิธีการแทนที่เครื่องหมายทับไปข้างหน้าในสตริง JavaScript ทั่วโลก?


131

วิธีการแทนที่เครื่องหมายทับไปข้างหน้าในสตริง JavaScript ทั่วโลก?

คำตอบ:


257

สิ่งต่อไปนี้จะทำได้ แต่จะแทนที่เหตุการณ์เดียวเท่านั้น:

"string".replace('/', 'ForwardSlash');

สำหรับการแทนที่แบบโกลบอลหรือหากคุณต้องการนิพจน์ทั่วไปคุณก็ต้องหลีกเลี่ยงเครื่องหมายทับ:

"string".replace(/\//g, 'ForwardSlash');

3
ตัวอย่างข้อมูลแรกไม่ได้ทำการแทนที่ส่วนกลาง ไม่แน่ใจว่าจะทำการแทนที่โกลบอลด้วยวิธีที่ไม่ใช่ regex ได้อย่างไร
BoltClock

ใช่ฉันไม่ได้ลองด้วยการเฉือนมากกว่านี้ สามารถทำได้"string".replace('/', 'ForwardSlash', 'g')แต่นั่นไม่ใช่อาร์กิวเมนต์ที่ไม่ได้มาตรฐานซึ่งใช้ได้เฉพาะใน Firefox afaik
Seldaek

1
"string".replace(/\//g, 'ForwardSlash');ใช้งานได้ แต่ลบ / g ออกจากสิ่งนี้และไม่ได้ผล
johntrepreneur

1
@johntrepreneur /กรัมแสดงให้เห็นว่ามันเป็นทดแทนทั่วโลกเช่นแทนที่ทุกกรณีของการจับคู่ หากไม่มี g มันจะแทนที่อินสแตนซ์เดียวเท่านั้น และถ้าคุณลบออก/gคุณจะทำลาย regex อย่างสมบูรณ์ตั้งแต่สุดท้าย / เป็นตัวคั่นท้าย
Seldaek

1
@RameshRajendran นั่นเป็นวิธีที่ API คือ .. โดยค่าเริ่มต้นจะแทนที่เพียงครั้งเดียวแล้วหยุดเมื่อพบว่ามีการแทนที่ โปรดดูdeveloper.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Seldaek

27

ใช้ลิเทอรัล regex กับgตัวปรับแต่งและหลีกเลี่ยงเครื่องหมายทับไปข้างหน้าด้วยแบ็กสแลชเพื่อไม่ให้ขัดแย้งกับตัวคั่น

var str = 'some // slashes', replacement = '';
var replaced = str.replace(/\//g, replacement);

7

โดยไม่ใช้ regex (แม้ว่าฉันจะทำสิ่งนี้ก็ต่อเมื่อสตริงการค้นหาเป็นอินพุตของผู้ใช้):

var str = 'Hello/ world/ this has two slashes!';
alert(str.split('/').join(',')); // alerts 'Hello, world, this has two slashes!' 



2

คุณต้องปิดเครื่องหมายทับเพื่อหลีกเลี่ยงปัญหาข้ามเบราว์เซอร์หรือ // แสดงความคิดเห็น

str = 'this/that and/if';

var newstr = str.replace(/[/]/g, 'ForwardSlash');

1

สวัสดีการแก้ไขเล็กน้อยในสคริปต์ด้านบน .. สคริปต์ด้านบนข้ามอักขระตัวแรกเมื่อแสดงผลลัพธ์

function stripSlashes(x)
{
var y = "";
for(i = 0; i < x.length; i++)
{
    if(x.charAt(i) == "/")
    {
        y += "";
    }
    else
    {
        y+= x.charAt(i);
    }
}
return y;   
}

0
var str = '/questions'; // input: "/questions"
while(str.indexOf('/') != -1){
   str = str.replace('/', 'http://stackoverflow.com/');
}
alert(str); // output: "http://stackoverflow.com/questions"

regex ที่เสนอ/\//gไม่ได้ผลสำหรับฉัน ส่วนที่เหลือของบรรทัด ( //g, replacement);) ถูกแสดงความคิดเห็น


1
โปรดทราบว่าฉันไม่แน่ใจว่าประสิทธิภาพของสิ่งนี้เปรียบเทียบกับโซลูชันการแบ่ง / รวมอาร์เรย์ที่เสนออย่างไร
Christopher Lincoln

... สะดุดมากกว่านี้ ... ลองใช้ IDE อื่นโดยใช้การเน้นไวยากรณ์ที่ชาญฉลาดขึ้น อย่าพึ่งพาสีของโปรแกรมแก้ไขโค้ดของคุณ แต่เชื่อในพลังของตัวแยกวิเคราะห์ที่ระบุสถานะอย่างเหมาะสมในการสร้างรหัสของคุณในรันไทม์
soletan

0

นี่เป็นความคิดของ Christopher Lincolns แต่มีรหัสที่ถูกต้อง:

function replace(str,find,replace){
    if (find != ""){
        str = str.toString();
        var aStr = str.split(find);
        for(var i = 0; i < aStr.length; i++) {
            if (i > 0){
                str = str + replace + aStr[i];
            }else{
                str = aStr[i];
            }
        }
    }
    return str;
}

ตัวอย่างการใช้งาน:

var somevariable = replace('//\\\/\/sdfas/\/\/\\\////','\/sdf','replacethis\');

การแทนที่สตริงส่วนกลางของ Javascript มีความซับซ้อนโดยไม่จำเป็น ฟังก์ชันนี้ช่วยแก้ปัญหานั้นได้ อาจมีผลกระทบต่อประสิทธิภาพเล็กน้อย แต่ฉันมั่นใจว่ามันไม่สำคัญ

นี่เป็นอีกทางเลือกหนึ่งฟังก์ชันดูสะอาดกว่ามาก แต่โดยเฉลี่ยแล้วช้ากว่าฟังก์ชันข้างต้นประมาณ 25 ถึง 20 เปอร์เซ็นต์:

function replace(str,find,replace){
    if (find !== ""){
        str = str.toString().split(find).join(replace);
    }
    return str;
}

-1

คุณสามารถสร้างRegExpวัตถุเพื่อให้อ่านง่ายขึ้น

str.replace(new RegExp('/'), 'foobar');

หากคุณต้องการแทนที่ทั้งหมดให้เพิ่ม"g"แฟล็ก

str.replace(new RegExp('/', 'g'), 'foobar');
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.