在一个替换呼叫中替换多个字符


256

一个非常简单的小问题,但是我不太明白该怎么做。

我需要将'_'的每个实例替换为空格,并将'#'的每个实例替换为空/空。

var string = '#Please send_an_information_pack_to_the_following_address:';

我已经试过了:

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

我真的不喜欢这样的链接命令。还有另一种方法可以做到这一点吗?


看到这个问题的答案: stackoverflow.com/questions/7072330/...
DeweyOx

Answers:


513

使用OR运算符(|):

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

您还可以使用字符类:

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

小提琴

如果您想用一件事替换哈希值,而用另一件事替换下划线,那么您只需要链接即可。但是,您可以添加一个原型:

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

但是为什么不连锁呢?我认为这没有错。


这很酷,但是我需要用不为空的空格替换下划线,我可以这样做吗?
香农·霍奇金斯

这么认为,但您仍然可以帮助我理解替换表达式的工作原理:)
Shannon Hochkins 2013年

您的原型不起作用?你能提供一个小提琴的例子吗,我一直在犯错误
Shannon Hochkins

3
的另一个选择#|_[#_],您不妨使用它+来匹配任何连续的比赛以提高性能
Ian

3
谢谢,如果需要替换空格,请str.replace(/[+ -]/g,'');在中间插入另一个符号。
Equiman 2013年

53

链接很酷,为什么不考虑它呢?

无论如何,这是一次替换中的另一种选择:

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

如果match ==“#”,替换将选择“”,否则将选择“”。

[更新]对于更通用的解决方案,您可以将替换字符串存储在一个对象中:

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

4
采取额外的步骤:var regex = new RegExp( Object.keys(replaceChars).join("|"), "g"); string.replace(regex,function(match) {return replaceChars[match];})这使修改replaceChars更加容易。
RozzA

@RozzA谢谢。当时Object.keys并不是主流。
Christophe

我完全忘记了替换第二个参数的替换功能选项,以帮助我记住:)
Luckylooke

48

如果您要替换多个字符,则可以使用replace String.prototype.replace()参数调用,该参数是针对每次匹配调用的函数。您只需要一个代表字符映射的对象,该对象将在该函数中使用。

例如,如果你想a与更换xbycz,你可以这样做:

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

输出234xyz567yyyyxz


3
因为你使用ES6(箭头功能),你也应该更换varconst在这里。扩展的浏览器支持的替代方法:var s ='234abc567bbbbac'; s = s.replace(/[abc]/g, function(m) { return {'a':'x','b':'y','c':'z'}[m]; }); console.log(s);
Felix Geenen

1
@FelixGeenen 1.您取消了可移植性2.如果您选择重新定义char或s,则会收到运行时错误,这会破坏其健壮性。3.除了纯粹的意识形态错误之外,没有任何理由可以防止s发生突变和重新绑定。看到此片段在双击/ cscript / wscript的新安装的Windows98中仍然可以使用,真是一件令人高兴的事: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

这真的很好。谢谢。使用对象执行or语句的部分是什么。您是否有文档或参考文献来说明这一点。相当不错的用例。
基督教马修

39

/g在正则表达式上指定(全局)标志以替换所有匹配项,而不仅仅是第一个:

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

要用一个东西替换一个字符,而用别的东西替换另一个字符,您真的无法避免需要两个单独的调用replace。您可以像Doorknob一样将其抽象为一个函数,尽管我可能希望它以旧/新对象作为键/值对,而不是平面数组。


我也将如何包含哈希?
香农·霍奇金斯

4

您也可以尝试这样:

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指要查找replace的文本和要替换为的文本

这将替换不区分大小写的字符。否则,只需根据需要更改Regex标志即可。例如:对于区分大小写的替换:

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

4

您可以尝试以下方法:

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

这将用您的replacechar替换。,-和#!


已经提供了此答案,无法解决用其他字符替换其他字符的问题,请参阅OP。
Shannon Hochkins '16

3

这是没有RegEx的简单方法。
您可以根据需要原型化和/或缓存事物。

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

我知道您没有声明它,但是仅使用正则表达式是否更优雅?str.replace(/#|_/g,'')
Shannon Hochkins,2015年

1
@ShannonHochkins当然可以!我不是要抨击RegEx;我只是显示另一个选择。RegEx并不总是很直观,因此适合“用作锤子,将每个问题都当作钉子”。再加上其他的答案,作为一个可重用的函数,这个函数并不冗长,而且参数易于理解。就我个人而言,我会在此处回答一个简短的RegEx,如果您只是在寻找快速插入的片段,而您不介意不完全理解,那是很有意义的。
2015年

好吧,如果您需要翻译字符(使用sed y命令或Unix tr),这似乎是正确的答案。
爱德华

3

请尝试:

  • 替换多字符串

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

  • 替换多字符

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

祝好运!


2

您还可以将RegExp对象传递给replace方法,例如

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

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

Javascript RegExp


OP不想链接replace电话-这无助于避免这种情况。
丹尼斯

2

yourstring ='#Please send_an_information_pack_to_the_following_address:';

用''替换'#'并用空格替换'_'

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

newstring2是您的结果


您的答案没有使用一小段jQuery,也没有遵循OP,' this #is__ #a test ### '. split ('_')。join('')不能像您最终会有更多的空白
Shannon Hochkins

@ShannonHochkins将如何添加更多空白?
哈夫苏·玛鲁

看一下我的示例,当空格前有一个下划线或两个下划线时,您将最终得到多个空格。
Shannon Hochkins '17

@ShannonHochkins发问者使用字符串'#Please send_an_information_pack_to_the_following_address:'; 这里没有空间。为什么我会想到它。当思考时,为什么仅关于空间,可能还会发生许多其他事情。
哈夫苏·马鲁

我建议您重新阅读OP,我是原始发帖人,您可以在我的第一个变量var str = '#this #is__ __#a test###__';中清楚地看到此字符串中明显有多个空格。
Shannon Hochkins '18

2

这是另一个使用String Prototype的版本。请享用!

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

我不知道有多少,这将帮助,但我想删除<b>,并</b>从我的字符串

所以我用

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

因此,基本上,如果您希望减少有限数量的字符并且不浪费时间,这将很有用。


-1

这是使用“减少”多次替换功能的“安全HTML”功能(此功能将每次替换应用于整个字符串,因此替换之间的依赖性非常重要)。

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

谢谢你的职位,但是它相对于公认的答案是相当广泛
香农Hochkins

该问题的答案是单行函数。那“广泛”如何?确保用户输入安全是一个重要的例子。你太挑剔了。“减少”是您应该了解的非常有用的技术。
David Spector

我说您的答案太广泛了,它的代码很多,无论如何您都在使用正则表达式,只是使过程太复杂了,不确定与这些答案中的任何一个相比,您认为您的答案是否会减少...
Shannon Hochkins

我的答案是“减少”答案,因为它使用Array.prototype.reduce函数。较短的答案可能使用字符串而不是属性键,这是因为利用了“安全HTML”功能仅在替换单个字符时起作用的事实。我向您提出一个更优雅的答案,而不是像在公共场合那样无礼地抱怨。
David Spector

实际上,我说了谢谢,并给了您批评,您接受了这一点,并决定写一些令人讨厌的东西,如果我们要开始使用功能性方法而不是像应该使用的原型链式方法那样执行操作,那么事情就简单得多了:jsfiddle .net / shannonhochkins / xsm9j610 / 21
Shannon Hochkins
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.