Cách thay thế tất cả các dấu chấm trong chuỗi bằng JavaScript


426

Tôi muốn thay thế tất cả các lần xuất hiện của dấu chấm ( .) trong chuỗi JavaScript

Ví dụ: tôi có:

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

Tôi muốn nhận được : okay this is a string.

Cho đến nay tôi đã thử:

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

nhưng điều này kết thúc với tất cả các chuỗi được thay thế vào khoảng trắng.


8
Câu trả lời của aefxx là đúng, nhưng cũng giống như một FYI là ký tự dấu chấm trong regex có nghĩa là khớp với mọi thứ , do đó mọi thứ đều là một khoảng trắng. Thoát khỏi nó với dấu gạch chéo ngược có nghĩa là khớp với các dấu chấm.
swilliams

Cảm ơn vì tiền hỗ trợ. Tôi đã có một số khoảnh khắc AHA (khi xây dựng ứng dụng) với Regex. Tôi thực sự ghét nó _ , bạn có một số hướng dẫn tốt, mát mẻ?
Omar Abid

rubular.com là những gì bạn đang tìm kiếm
Languages

1
Đừng sử dụng regex cho một cái gì đó tầm thường này.
Steven Lu

Thật không may, nó không giống như một phi-regex có thể cho phép thay thế một chuỗi nhiều lần.
Steven Lu

Câu trả lời:


777

Bạn cần phải thoát .vì nó có nghĩa là "một nhân vật tùy ý" trong một biểu thức thông thường.

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

25
chỉ cần làm rõ, \ thoát các ký tự đặc biệt trong các biểu thức thông thường, như. trong trường hợp này
realgt

trông giống như sed .. bằng cách nào đó .. :)
Paschalis

trong reagukar biểu hiện dấu chấm. có nghĩa là tất cả, đây là giải pháp chính xác!
Benjamin Fuentes

1
@Kingalione Chính xác thì cái gì không hoạt động? Bạn có thể giải thích?
aefxx

1
@Webdess Đó là những gì công cụ gsửa đổi ở cuối biểu thức được sử dụng cho. Hãy nghĩ về nó như (g) thùy.
aefxx

301

Thêm một giải pháp dễ hiểu :)

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

25
@HaggleLad vì bạn không cần phải gây rối với regex
ton.yeung

5
Đây không phải là chậm hơn nhiều so với regexing?
Jasper Kennis

1
@ Hiểu theo hiểu biết của tôi, nó thực sự nhanh hơn trong hầu hết các trình duyệt, mặc dù tôi chưa thực sự tự chuẩn hóa nó.
andrew

9
@BetoFrega Không có gì giống như một số dữ liệu thực nghiệm để làm cho trường hợp của bạn :). Cảm ơn đã cung cấp các liên kết!
nghiệm123

3
Nếu bạn sử dụng RegExp, bạn muốn lưu trữ regex trong một biến riêng biệt bên ngoài vòng lặp. Biên dịch / giải thích một regex mất một chút thời gian, nhưng một khi nó được biên dịch, nó có thể được sử dụng khá nhanh. Vui lòng thử các thử nghiệm tôi đã thực hiện: 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('.', ' '));

Nhanh hơn sử dụng regex ...

EDIT:
Có thể tại thời điểm tôi thực hiện mã này, tôi đã không sử dụng jsperf. Nhưng cuối cùng, cuộc thảo luận như vậy là hoàn toàn vô nghĩa, sự khác biệt về hiệu năng không xứng đáng với mức độ dễ đọc của mã trong thế giới thực, vì vậy câu trả lời của tôi vẫn hợp lệ, ngay cả khi hiệu suất khác với cách tiếp cận regex.

EDIT2:
Tôi đã tạo một lib cho phép bạn thực hiện điều này bằng giao diện lưu loát:

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

Xem https://github.com/FagnerMartinsBrack/str-replace .


1
Rất hữu ích. FYI: Có những nhân vật bất hảo sau dấu chấm phẩy trong tuyên bố cảnh báo.
Patrick

Ý bạn là gì đối với "nhân vật bất hảo"?
Fagner Brack

1
Anh ta có nghĩa là thực thể & # 8203; hai lần, đó là ký tự Unicode 'ZERO WIDTH SPACE' (U + 200B). Thông tin thêm về fileformat.info/info/unicode/char/200b/index.htm
Cur

@FagnerBrack Có lẽ bạn nên di chuyển str.toLowerCase()ra khỏi vòng lặp vì lý do hiệu suất. Ngoài ra, thao tác chuỗi mà bạn đang tìm kiếm có lẽ ít hơn tối ưu. Tôi đã đăng câu trả lời với phiên bản sửa đổi: stackoverflow.com/questions/2390789/ từ
sstur

@sstur Tôi cho rằng cần phải viết lại chuỗi sau khi thao tác. Là thao tác chuỗi tôi đang tìm kiếm một sự khác biệt đáng kể trong hiệu suất? Tôi cho rằng mức độ dễ đọc vượt qua các lợi ích (chưa được kiểm tra).
Fagner Brack


15

Đối với kịch bản đơn giản này, tôi cũng khuyên bạn nên sử dụng các phương thức tích hợp trong javascript.

Bạn có thể thử điều này:

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

Lời chào hỏi


6

Tôi thêm dấu gạch chéo kép vào dấu chấm để làm cho nó hoạt động. Vui lên.

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

4

Điều này ngắn gọn / dễ đọc hơn và sẽ hoạt động tốt hơn so với bài được đăng bởi Fagner Brack (toLowerCase không được thực hiện trong vòng lặp):

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

Sử dụng:

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

1
Trên thực tế, nó xuất hiện thoát RegEx hoạt động tốt hơn indexOf! Nghe có vẻ không đúng, nhưng JSPerf chỉ ra rằng nó nhanh hơn nhiều: jsperf.com/replaceall-indexof-vs-regex
sstur

Có thể tại thời điểm tôi thực hiện mã đó, tôi đã không sử dụng jsperf. Nhưng cuối cùng, cuộc thảo luận như vậy là hoàn toàn vô nghĩa, sự khác biệt về hiệu năng không xứng đáng với mức độ dễ đọc của mã trong thế giới thực, vì vậy câu trả lời của tôi vẫn còn hiệu lực.
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
Điều này sẽ không bị kẹt trong một vòng lặp vô hạn nếu bạn cho nó một cái gì đó như : replaceAll('&', '&')? (phải thừa nhận rằng đó không phải là một trường hợp trong câu hỏi của OP)
Anentropic

Nhưng "& amp;" chứa một &vòng lặp để không bao giờ hết những thứ cần thay thế (và chuỗi tiếp tục phát triển). Tôi đã thử nó ngay bây giờ và nó đã khóa trình duyệt của tôi ...
Anentropic

2

Đây là một triển khai khác của thay thế. Hy vọng nó sẽ giúp được ai đó.

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

Sau đó, bạn có thể sử dụng nó:

var myText = "Tên tôi là George";
var newText = myText.replace ALL ("George", "Michael");


1
Điều này không xử lý tìm kiếm / thay thế không phân biệt chữ hoa chữ thường. Vì vậy, nó có chức năng tương đương với:string.split(stringToFind).join(stringToReplace)
sstur

0

Ví dụ: Tôi muốn thay thế tất cả Trích dẫn kép (") thành Trích dẫn đơn (') Sau đó, mã sẽ như thế này

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

0

@ scripto đã làm cho một chút súc tích hơn và không có 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;
}

Đây là cách nó sắp xếp: http://jsperf.com/replace-vs-split-join-vs-replaceall/68


0
String.prototype.replaceAll = function (needle, replacement) {
    return this.replace(new RegExp(needle, 'g'), replacement);
};

0
mystring.replace(new RegExp('.', "g"), ' ');

-1

bạn có thể thay thế tất cả sự xuất hiện của bất kỳ chuỗi / ký tự nào bằng cách sử dụng đối tượng javasscript RegExp.

Đây là mã

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, "'");
} 

Để thoát HTML, hãy sử dụngcreateTextNode
Downgoat
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.