วิธีแทนที่จุดทั้งหมดในสตริงโดยใช้ JavaScript


426

ฉันต้องการแทนที่การเกิดขึ้นทั้งหมดของจุด ( .) ในสตริง JavaScript

ตัวอย่างเช่นฉันมี:

var mystring = 'okay.this.is.a.string';

ฉันต้องการได้รับ: okay this is a string.

จนถึงตอนนี้ฉันพยายาม:

mystring.replace(/./g,' ')

แต่สิ่งนี้จะจบลงด้วยสตริงทั้งหมดแทนที่ด้วยช่องว่าง


8
คำตอบของ aefxx นั้นถูกต้อง แต่เช่นเดียวกับ FYI ก็คือตัวอักษรที่มีจุดใน regex หมายถึงจับคู่ทุกอย่างดังนั้นทุกอย่างจึงเป็นช่องว่าง การหลบหลีกด้วยแบ็กสแลชหมายถึงการจับคู่ตามช่วงเวลา
swilliams

ขอบคุณสำหรับทิป. ฉันมีช่วงเวลา AHA (เมื่อสร้างแอป) ด้วย Regex ฉันเกลียดมันมากเลย_คุณมีแบบฝึกหัดที่ยอดเยี่ยมและดีไหม?
Omar Abid

rubular.com คือสิ่งที่คุณกำลังมองหา
LanguagesNamedAfterCofee

1
อย่าใช้ regexกับสิ่งเล็ก ๆ น้อย ๆ นี้
Steven Lu

น่าเสียดายที่ไม่ใช่ว่าไม่ใช่ regex สามารถอนุญาตให้เปลี่ยนสตริงได้หลายครั้ง
Steven Lu

คำตอบ:


777

คุณต้องหลบหนี.เพราะมันมีความหมายของ "ตัวละครโดยพลการ" ในการแสดงออกปกติ

mystring = mystring.replace(/\./g,' ')

25
เพื่อชี้แจง, \ อักขระพิเศษในการหลบหนีออกจากการแสดงออกปกติเช่น ในกรณีนี้
realgt

ดูเหมือนว่าจะเป็น .. .. อย่างใด :)
Paschalis

ในการแสดงออก reagukar จุด หมายถึงทั้งหมดสิ่งนี้เป็นทางออกที่ถูกต้อง!
Benjamin Fuentes

1
@Kingalione อะไรไม่แน่นอน? คุณสามารถทำอย่างละเอียด?
aefxx

1
@Webwoman นั่นคือสิ่งที่ใช้gปรับปรุงในตอนท้ายของนิพจน์ คิดว่ามันเป็น (g) lobally
aefxx

302

อีกหนึ่งโซลูชั่นที่เข้าใจง่าย :)

var newstring = mystring.split('.').join(' ');

25
@ HaggleLad เพราะคุณไม่จำเป็นต้องยุ่งกับ regex
ton.yeung

5
นี่ช้ากว่าการจดจ่อไหม?
Jasper Kennis

1
@ Jasper จากความเข้าใจของฉันมันเร็วกว่าจริงในเบราว์เซอร์ส่วนใหญ่ถึงแม้ว่าฉันจะไม่ได้ทำการเปรียบเทียบด้วยตนเอง
andrew

9
@BetoFrega ไม่มีอะไรที่เหมือนกับข้อมูลเชิงประจักษ์ที่จะทำให้กรณีของคุณ :) ขอบคุณที่ให้ลิงค์!
ทดสอบ 123

3
ถ้าคุณใช้ RegExp คุณต้องการเก็บ regex ในตัวแปรแยกนอกลูป การคอมไพล์ / การตีความ regex ใช้เวลาพอสมควร แต่เมื่อมันถูกคอมไพล์แล้วก็สามารถใช้งานได้อย่างรวดเร็ว โปรดลองทดสอบเหล่านี้ที่ฉันทำ: jsperf.com/replace-vs-split-join-vs-replaceall/23
sanderd17

53
/**
 * ReplaceAll by Fagner Brack (MIT Licensed)
 * Replaces all occurrences of a substring in a string
 */
String.prototype.replaceAll = function( token, newToken, ignoreCase ) {
    var _token;
    var str = this + "";
    var i = -1;

    if ( typeof token === "string" ) {

        if ( ignoreCase ) {

            _token = token.toLowerCase();

            while( (
                i = str.toLowerCase().indexOf(
                    _token, i >= 0 ? i + newToken.length : 0
                ) ) !== -1
            ) {
                str = str.substring( 0, i ) +
                    newToken +
                    str.substring( i + token.length );
            }

        } else {
            return this.split( token ).join( newToken );
        }

    }
return str;
};

alert('okay.this.is.a.string'.replaceAll('.', ' '));

เร็วกว่าการใช้ regex ...

แก้ไข:
บางทีในเวลาที่ฉันทำรหัสนี้ฉันไม่ได้ใช้ jsperf แต่ในท้ายที่สุดการสนทนาดังกล่าวไม่มีจุดหมายโดยสิ้นเชิงความแตกต่างด้านประสิทธิภาพไม่คุ้มกับความชัดเจนของรหัสในโลกแห่งความเป็นจริงดังนั้นคำตอบของฉันยังคงใช้ได้แม้ว่าประสิทธิภาพจะแตกต่างจากแนวทางของ regex

EDIT2:
ฉันได้สร้าง lib ที่ช่วยให้คุณสามารถทำได้โดยใช้ส่วนต่อประสานที่คล่องแคล่ว:

replace('.').from('okay.this.is.a.string').with(' ');

ดูhttps://github.com/FagnerMartinsBrack/str-replace


1
มีประโยชน์มาก. FYI: มีตัวอักษรโกงหลังเซมิโคลอนในคำสั่งการแจ้งเตือน
Patrick

สิ่งที่คุณหมายถึง "ตัวละครหลอกลวง"
Fagner Brack

1
เขาหมายถึงเอนทิตี & # 8203; สองครั้งซึ่งเป็นอักขระ Unicode 'ZERO WIDTH SPACE' (U + 200B) ข้อมูลเพิ่มเติมเกี่ยวกับfileformat.info/info/unicode/char/200b/index.htm
Cœur

@FagnerBrack คุณควรย้ายstr.toLowerCase()ออกจากลูปด้วยเหตุผลด้านประสิทธิภาพ นอกจากนี้การจัดการกับสตริงที่คุณกำลังค้นหาอาจน้อยกว่าค่าที่เหมาะสม ฉันโพสต์คำตอบพร้อมกับเวอร์ชันที่แก้ไขแล้ว: stackoverflow.com/questions/2390789/…
sstur

@ sstur ฉันคิดว่ามันจำเป็นต้องใช้ตัวพิมพ์เล็กสตริงอีกครั้งหลังจากการจัดการ การจัดการกับสตริงที่ฉันค้นหามีความแตกต่างอย่างมากในประสิทธิภาพหรือไม่? ฉันคิดว่ามันชัดเจนกว่าประโยชน์ (ยังไม่ทดลอง)
Fagner Brack


15

สำหรับสถานการณ์ง่าย ๆ นี้ฉันขอแนะนำให้ใช้วิธีการที่มาพร้อมบิวด์อินในจาวาสคริปต์

คุณสามารถลองสิ่งนี้:

"okay.this.is.a.string".split(".").join("")

ทักทาย


6

ฉันเพิ่มแบ็กสแลชสองครั้งที่จุดเพื่อให้ทำงานได้ เชียร์

var st = "okay.this.is.a.string";
var Re = new RegExp("\\.","g");
st = st.replace(Re," ");
alert(st);

4

นี่คือกระชับ / อ่านได้และควรจะทำงานได้ดีกว่าที่โพสต์โดย Fagner Brack (toLowerCase ไม่ได้ดำเนินการในวง):

String.prototype.replaceAll = function(search, replace, ignoreCase) {
  if (ignoreCase) {
    var result = [];
    var _string = this.toLowerCase();
    var _search = search.toLowerCase();
    var start = 0, match, length = _search.length;
    while ((match = _string.indexOf(_search, start)) >= 0) {
      result.push(this.slice(start, match));
      start = match + length;
    }
    result.push(this.slice(start));
  } else {
    result = this.split(search);
  }
  return result.join(replace);
}

การใช้งาน:

alert('Bananas And Bran'.replaceAll('An', '(an)'));

1
ในความเป็นจริงแล้ว RegEx จะทำงานได้ดีกว่า indexOf! เสียงไม่ถูกต้อง แต่ JSPerf ระบุว่ามันเร็วกว่ามาก: jsperf.com/replaceall-indexof-vs-regex
sstur

บางทีในเวลาที่ฉันทำรหัสนั้นฉันไม่ได้ใช้ jsperf แต่ในที่สุดการสนทนาดังกล่าวไม่มีจุดหมายโดยสิ้นเชิงความแตกต่างด้านประสิทธิภาพไม่คุ้มกับความชัดเจนของรหัสในโลกแห่งความเป็นจริงดังนั้นคำตอบของฉันยังคงใช้ได้
Fagner Brack

2
String.prototype.replaceAll = function(character,replaceChar){
    var word = this.valueOf();

    while(word.indexOf(character) != -1)
        word = word.replace(character,replaceChar);

    return word;
}

3
จะไม่ได้รับนี้ติดอยู่ในวง จำกัด ถ้าคุณให้สิ่งที่ชอบreplaceAll('&', '&')? (เป็นที่ยอมรับว่าไม่ใช่กรณีในคำถามของ OP)
Anentropic

แต่ "& amp;" มี&ห่วงดังนั้นไม่เคยหมดสิ่งที่จะแทนที่ (และสตริงยังคงเติบโต) ฉันลองแล้วและล็อคเบราว์เซอร์ของฉัน ...
Anentropic

2

นี่คือการใช้งานของ replaceAll อื่น หวังว่าจะช่วยใครซักคน

    String.prototype.replaceAll = function (stringToFind, stringToReplace) {
        if (stringToFind === stringToReplace) return this;
        var temp = this;
        var index = temp.indexOf(stringToFind);
        while (index != -1) {
            temp = temp.replace(stringToFind, stringToReplace);
            index = temp.indexOf(stringToFind);
        }
        return temp;
    };

จากนั้นคุณสามารถใช้มัน:

var myText = "ฉันชื่อจอร์จ";
var newText = myText.replaceAll ("George", "Michael");


1
สิ่งนี้ไม่จัดการการค้นหา / การเปลี่ยนแบบตัวพิมพ์เล็ก / ใหญ่ ดังนั้นจึงเป็นหน้าที่เทียบเท่า:string.split(stringToFind).join(stringToReplace)
sstur

0

ตัวอย่าง: ฉันต้องการแทนที่ใบเสนอราคาคู่ (") ทั้งหมดเป็นใบเสนอราคาเดียว (') จากนั้นโค้ดจะเป็นเช่นนี้

var str= "\"Hello\""
var regex = new RegExp('"', 'g');
str = str.replace(regex, '\'');
console.log(str); // 'Hello'

0

@ scripto ทำให้กระชับมากขึ้นและไม่มีprototype:

function strReplaceAll(s, stringToFind, stringToReplace) {
    if (stringToFind === stringToReplace) return s;
    for (let index = s.indexOf(stringToFind); index != -1; index = s.indexOf(stringToFind))
        s = s.replace(stringToFind, stringToReplace);
    return s;
}

นี่คือวิธีการวางซ้อน: http://jsperf.com/replace-vs-split-join-vs-replaceall/68




-1

คุณสามารถแทนที่สตริง / อักขระใด ๆ ที่เกิดขึ้นโดยใช้วัตถุ RegExp javasscript

นี่คือรหัส

var mystring = 'okay.this.is.a.string';

var patt = new RegExp("\\.");

while(patt.test(mystring)){

  mystring  = mystring .replace(".","");

}

-5
var mystring = 'okay.this.is.a.string';
var myNewString = escapeHtml(mystring);

function escapeHtml(text) {
if('' !== text) {
    return text.replace(/&/g, "&")
               .replace(/&lt;/g, "<")
               .replace(/&gt;/g, ">")
               .replace(/\./g,' ')
               .replace(/&quot;/g, '"')
               .replace(/&#39/g, "'");
} 

เพื่อหลบหนี HTML ใช้createTextNode
Downgoat
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.