Thay thế nhiều ký tự trong một cuộc gọi thay thế


257

Câu hỏi rất đơn giản, nhưng tôi không hiểu làm thế nào để làm điều đó.

Tôi cần thay thế mọi phiên bản của '_' bằng một khoảng trắng và mọi phiên bản của '#' bằng không có gì / trống.

var string = '#Please send_an_information_pack_to_the_following_address:';

Tôi đã thử điều này:

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

Tôi không thực sự thích các chuỗi lệnh như thế này. Có cách nào khác để làm điều đó trong một?


Xem câu trả lời cho câu hỏi này: stackoverflow.com/questions/7072330/ từ
DeweyOx

Câu trả lời:


515

Sử dụng toán tử OR ( |):

var str = '#this #is__ __#a test###__';
str.replace(/#|_/g,''); // result: "this is a test"

Bạn cũng có thể sử dụng một lớp nhân vật:

str.replace(/[#_]/g,'');

Vĩ cầm

Nếu bạn muốn thay thế hàm băm bằng một thứ và gạch dưới bằng một thứ khác, thì bạn sẽ phải xâu chuỗi. Tuy nhiên, bạn có thể thêm một nguyên mẫu:

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

Tại sao không chuỗi, mặc dù? Tôi thấy không có gì sai với điều đó.


Điều này thật tuyệt, nhưng tôi cần thay thế dấu gạch dưới bằng các khoảng trống không trống, tôi có thể làm điều này không?
Shannon Hochkins

Nghĩ vậy, nhưng bạn vẫn giúp tôi hiểu cách các biểu thức thay thế hoạt động tốt hơn một chút :)
Shannon Hochkins

Nguyên mẫu của bạn không hoạt động? bạn có thể cung cấp một ví dụ về fiddle không, tôi cứ bị lỗi
Shannon Hochkins

3
Một tùy chọn khác #|_[#_], và bạn cũng có thể sử dụng +để khớp bất kỳ trận đấu liên tiếp nào để cải thiện hiệu suất
Ian

3
Thật tuyệt, cảm ơn ... nếu cần thay thế chỗ trống và các biểu tượng khác str.replace(/[+ -]/g,'');chỉ cần đặt khoảng trống ở giữa.
Equiman

53

Chaining là mát mẻ, tại sao bỏ qua nó?

Dù sao, đây là một lựa chọn khác trong một thay thế:

string.replace(/#|_/g,function(match) {return (match=="#")?"":" ";})

Việc thay thế sẽ chọn "" if match == "#", "" nếu không.

[Cập nhật] Đối với một giải pháp chung chung hơn, bạn có thể lưu trữ các chuỗi thay thế của mình trong một đối tượng:

var replaceChars={ "#":"" , "_":" " };
string.replace(/#|_/g,function(match) {return replaceChars[match];})

4
thực hiện bước bổ sung: var regex = new RegExp( Object.keys(replaceChars).join("|"), "g"); string.replace(regex,function(match) {return replaceChars[match];})điều này làm cho việc sửa đổi thay thế dễ dàng hơn.
RozzA

@RozzA cảm ơn. Object.keys không phải là chủ đạo tại thời điểm đó.
Christophe

Tôi hoàn toàn quên mất tùy chọn chức năng thay thế để thay thế tham số thứ hai, vì đã giúp tôi nhớ :)
Luckylooke

48

Nếu bạn muốn thay thế nhiều ký tự, bạn có thể gọi String.prototype.replace()với đối số thay thế là một hàm được gọi cho mỗi trận đấu. Tất cả những gì bạn cần là một đối tượng thể hiện ánh xạ ký tự mà bạn sẽ sử dụng trong hàm đó.

Ví dụ: nếu bạn muốn athay thế bằng x, bbằng ycbằng z, bạn có thể làm một cái gì đó như thế này:

var chars = {'a':'x','b':'y','c':'z'};
var s = '234abc567bbbbac';
s = s.replace(/[abc]/g, m => chars[m]);
console.log(s);

Đầu ra :234xyz567yyyyxz


3
vì bạn sử dụng ES6 (chức năng mũi tên), bạn cũng nên thay thế varbằng constở đây. một giải pháp thay thế cho hỗ trợ trình duyệt mở rộng:var s ='234abc567bbbbac'; s = s.replace(/[abc]/g, function(m) { return {'a':'x','b':'y','c':'z'}[m]; }); console.log(s);
Felix Geenen 23/03/18

1
@FelixGeenen 1. bạn giết tính di động 2. nếu bạn chọn xác định lại ký tự hoặc s, bạn sẽ gặp lỗi thời gian chạy, nó sẽ giết chết tính mạnh mẽ của nó, 3. không có bảo đảm nào để bảo vệ s khỏi đột biến và phản xạ khác ngoài ý thức hệ hoàn toàn. Thật là một điều tuyệt vời khi thấy đoạn trích này vẫn sẽ hoạt động trong các cửa sổ mới được cài đặt 98 trên nhấp đúp / 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

Cái này thật sự rất tốt. cảm ơn. Phần mà bạn đã sử dụng một đối tượng để thực hiện một câu lệnh hoặc là gì. Bạn có tài liệu hoặc tài liệu tham khảo cho một cái gì đó giải thích điều đó. Trường hợp sử dụng khá tốt.
Christian Matthew

39

Chỉ định /gcờ (toàn cầu) trên biểu thức chính quy để thay thế tất cả các kết quả khớp thay vì chỉ đầu tiên:

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

Để thay thế một nhân vật bằng một thứ và một nhân vật khác bằng một thứ khác, bạn thực sự không thể thực hiện được khi cần hai cuộc gọi riêng biệt replace. Bạn có thể trừu tượng hóa nó thành một hàm như Doorknob đã làm, mặc dù tôi có thể sẽ lấy nó một đối tượng với cặp khóa / giá trị cũ / mới thay vì một mảng phẳng.


Làm thế nào tôi sẽ bao gồm băm quá?
Shannon Hochkins

4

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

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đề cập đến văn bản được tìm thấy và replacevăn bản được thay thế bằng

Điều này sẽ được thay thế các nhân vật không nhạy cảm trường hợp. Để làm khác, chỉ cần thay đổi cờ Regex theo yêu cầu. Ví dụ: đối với trường hợp nhạy cảm thay thế:

new RegExp(find[i], 'g')

4

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

str.replace(/[.#]/g, 'replacechar');

cái này sẽ thay thế., - và # bằng replacechar của bạn!


Câu trả lời này đã được cung cấp và không xử lý thay thế các ký tự khác nhau bằng các ký tự khác, xem OP.
Shannon Hochkins

3

Đây là một cách đơn giản để làm điều đó mà không cần RegEx.
Bạn có thể tạo nguyên mẫu và / hoặc lưu trữ mọi thứ theo ý muốn.

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

Tôi biết bạn đã không nói rõ, nhưng nó không thanh lịch hơn nhiều khi chỉ sử dụng regex? str.replace(/#|_/g,'')
Shannon Hochkins

1
@ShannonHochkins Chắc chắn! Tôi không có ý định bash trên RegEx; Tôi chỉ hiển thị một tùy chọn khác. RegEx không phải lúc nào cũng trực quan và cho vay để được sử dụng "như một cái búa, coi mọi vấn đề như một cái đinh". Ngoài ra, hãy xem các câu trả lời khác, vì chức năng có thể sử dụng lại, câu hỏi này không dài hơn nhiều và các thông số rất dễ hiểu. Cá nhân tôi sẽ sử dụng một RegEx ngắn cho câu hỏi ở đây và sẽ hợp lý nếu bạn chỉ tìm kiếm một đoạn trích nhanh mà bạn không hiểu hoàn toàn.
Beejor 11/05/2015

Chà, nếu bạn cần dịch một ký tự ( lệnh à la sed y hoặc à la Unix tr), thì đây có vẻ là câu trả lời đúng.
Édouard

3

Vui lòng thử:

  • thay thế nhiều chuỗi

    var str = "http://www.abc.xyz.com"; str = str.replace(/http:|www|.com/g, ''); //str is "//.abc.xyz"

  • thay thế nhiều ký tự

    var str = "a.b.c.d,e,f,g,h"; str = str.replace(/[.,]/g, ''); //str is "abcdefgh";

Chúc may mắn!


2

Bạn cũng có thể truyền đối tượng RegExp cho phương thức thay thế như

var regexUnderscore = new RegExp("_", "g"); //indicates global match
var regexHash = new RegExp("#", "g");

string.replace(regexHash, "").replace(regexUnderscore, " ");

Javascript RegExp


OP không muốn thực hiện các replacecuộc gọi - điều này không giúp tránh điều đó.
Dennis

2

your chuỗi = '# Xin vui lòng gửi_an_in information_pack_to_the_following_address:';

thay thế '#' bằng '' và thay thế '_' bằng khoảng trắng

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

newopes2 là kết quả của bạn


Câu trả lời của bạn không sử dụng một mảnh vỡ của jQuery và cũng không tuân theo OP, '#this #is__ #a test ### ' .split ('_'). Tham gia ('') sẽ không hoạt động như bạn sẽ kết thúc với nhiều khoảng trắng hơn
Shannon Hochkins

@ShannonHochkins Làm thế nào nhiều khoảng trắng sẽ được thêm vào?
Hafsul Maru

Hãy xem ví dụ của tôi, khi có dấu gạch dưới trước một khoảng trắng hoặc hai dấu gạch dưới bạn sẽ kết thúc với nhiều khoảng trắng.
Shannon Hochkins

@ShannonHochkins người hỏi hỏi xử lý chuỗi '#Please send_an_inatures_pack_to_the_following_address:'; không có không gian ở đây tại sao tôi sẽ nghĩ về nó Khi nghĩ, tại sao chỉ về không gian, nhiều thứ khác có thể xảy ra.
Hafsul Maru

Tôi đề nghị bạn đọc lại OP, tôi là người đăng ban đầu và bạn có thể thấy rõ trong biến đầu tiên của tôi var str = '#this #is__ __#a test###__';có nhiều khoảng trống trong chuỗi này.
Shannon Hochkins

2

Đây là một phiên bản khác sử dụng String Prototype. Thưởng thức!

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

Tôi không biết điều này sẽ giúp được bao nhiêu nhưng tôi muốn xóa <b></b>khỏi chuỗi của tôi

vì vậy tôi đã sử dụng

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

vì vậy về cơ bản nếu bạn muốn giảm số lượng ký tự giới hạn và không lãng phí thời gian thì điều này sẽ hữu ích.


-1

Dưới đây là chức năng "HTML an toàn" bằng cách sử dụng nhiều chức năng thay thế 'giảm' (chức năng này áp dụng mỗi thay thế cho toàn bộ chuỗi, do đó sự phụ thuộc giữa các thay thế là rất đáng kể).

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

Cảm ơn vì bài đăng, tuy nhiên nó khá rộng so với câu trả lời được chấp nhận
Shannon Hochkins

Câu trả lời cho câu hỏi là hàm một dòng. Làm thế nào là "rộng rãi"? Làm cho đầu vào của người dùng an toàn là một ví dụ quan trọng. Bạn quá quan trọng. 'Giảm' là một kỹ thuật rất hữu ích mà bạn nên biết.
David Spector

Tôi đã nói câu trả lời của bạn quá rộng rãi, đó là nhiều mã hơn, dù sao bạn cũng đang sử dụng các biểu thức thông thường, chỉ khiến quá trình trở nên quá phức tạp, không chắc bạn nghĩ câu trả lời của bạn có giảm so với bất kỳ câu trả lời nào trong số này ...
Shannon Hồ Chí Minh

Câu trả lời của tôi là câu trả lời 'giảm' vì nó sử dụng hàm Array.prototype.reduce. Câu trả lời ngắn hơn có thể sử dụng chuỗi thay vì khóa thuộc tính, khai thác thực tế là chức năng "HTML an toàn" chỉ hoạt động khi thay thế các ký tự đơn. Tôi thách bạn đưa ra một câu trả lời tao nhã hơn thay vì phàn nàn một cách thô lỗ trước công chúng như thế này.
David Spector

Thật ra tôi đã nói lời cảm ơn, và đưa ra lời chỉ trích, bạn đã lấy nó và quyết định viết lại một cái gì đó lén lút
Shannon Hochkins
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.