Không phân biệt chữ hoa chữ thường thay thế tất cả


81

Tôi đang tìm kiếm bất kỳ triển khai nào của chức năng thay thế phân biệt chữ hoa chữ thường. Ví dụ, nó sẽ hoạt động như thế này:

'This iS IIS'.replaceAll('is', 'as');

và kết quả sẽ là:

'Thas as Ias'

Có ý kiến ​​gì không?

CẬP NHẬT:

Sẽ rất tuyệt nếu sử dụng nó với biến:

var searchStr = 'is';
'This iS IIS'.replaceAll(searchStr, 'as');

Câu trả lời:


141

Hãy thử regex:

'This iS IIS'.replace(/is/ig, 'as');

Ví dụ làm việc: http://jsfiddle.net/9xAse/

ví dụ:
Sử dụng đối tượng RegExp:

var searchMask = "is";
var regEx = new RegExp(searchMask, "ig");
var replaceMask = "as";

var result = 'This iS IIS'.replace(regEx, replaceMask);

2
Tuyệt quá! Nhưng làm thế nào để sử dụng biến thay thế? .replace(searchMask, replaceMask)?
Sergey Metlov

@DOTNET Ninja: Đã cập nhật bài đăng với một ví dụ.
Chandu

Anh sẽ cho hai upvotes nếu tôi có thể cho các mẫu mã thứ hai mà thực sự giải thích những gì đang xảy ra
Chris Marisic

7
CẢNH BÁO: Câu trả lời này sẽ gây lộn xộn khi có một ký tự có nghĩa regex. Xem câu trả lời của Benjamin Fleming để biết cách tiếp cận chính xác.
FlorianB

Cảm ơn bạn rất nhiều! Tôi đã thử trực tiếp trong chuỗi.
Saurabh Prajapati

54
String.prototype.replaceAll = function(strReplace, strWith) {
    // See http://stackoverflow.com/a/3561711/556609
    var esc = strReplace.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
    var reg = new RegExp(esc, 'ig');
    return this.replace(reg, strWith);
};

Điều này thực hiện chính xác ví dụ bạn đã cung cấp.

'This iS IIS'.replaceAll('is', 'as');

Lợi nhuận

'Thas as Ias'

1
Đây thực sự là giải pháp chính xác. Câu trả lời của Chandu sẽ gây lộn xộn khi có một ký tự có nghĩa là regex.
FlorianB

Điều này cũng có thể xử lý các trường hợp như: txt.replaceAll ( "(test12)", "")
user1400290

Giải pháp tốt nhất cho đến nay. Hoạt động một điều trị. Cảm ơn Ben.
Ste

8

Khi bạn sử dụng giải pháp regex, bạn có thể gặp sự cố nếu chuỗi thay thế của bạn chứa ví dụ: "?". Vì vậy, bạn phải thoát tất cả các ký tự regex hoặc sử dụng ví dụ:

String.replacei = String.prototype.replacei = function (rep, rby) {
    var pos = this.toLowerCase().indexOf(rep.toLowerCase());
    return pos == -1 ? this : this.substr(0, pos) + rby + this.substr(pos + rep.length);
};

điều này sẽ không thay đổi tất cả các lần xuất hiện của 'is' trong chuỗi. Do đó bạn có thể viết một vòng lặp while trong hàm.


Điều này cũng nhanh gấp đôi so với giải pháp regexp .. xem jsperf.com/replace-all-case-insenstive/1
kofifus

1
Điều này chỉ thay thế một thời gian
StefansArya

4

Đây là sự ngẫu hứng từ câu trả lời của Paul và có khoảng cách về hiệu suất giữa Regex và Non-regex

Mã regex để so sánh được lấy từ câu trả lời của Benjamin Fleming ..

JSPerf
Case-nhạy cảm
Regex: 66.542 Operations / sec
phi Regex: 178.636 Operations / sec (split - tham gia)


Regex không nhạy cảm : 37.837 Hoạt động / giây
Không Regex: 12.566 Hoạt động / giây (indexOf - substr)

String.prototype.replaces = function(str, replace, incaseSensitive) {
    if(!incaseSensitive){
        return this.split(str).join(replace);
    } else { 
        // Replace this part with regex for more performance

        var strLower = this.toLowerCase();
        var findLower = String(str).toLowerCase();
        var strTemp = this.toString();

        var pos = strLower.length;
        while((pos = strLower.lastIndexOf(findLower, pos)) != -1){
            strTemp = strTemp.substr(0, pos) + replace + strTemp.substr(pos + findLower.length);
            pos--;
        }
        return strTemp;
    }
};

// Example
var text = "A Quick Dog Jumps Over The Lazy Dog";
console.log(text.replaces("dog", "Cat", true));



-2

Tôi đề xuất hàm str_ireplace từ php.js, hàm này thậm chí thay thế các chuỗi từ mảng.


2
Sử dụng thư viện của bên thứ ba cho tác vụ đơn giản như vậy có thể là quá mức cần thiết.
Balázs Vincze
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.