在一次替换调用中替换多个字符

IT技术 javascript jquery
2021-01-24 18:07:09

非常简单的小问题,但我不太明白如何去做。

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

var string = '#Please send_an_information_pack_to_the_following_address:';

我试过这个:

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

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

6个回答

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

不过,为什么不连锁呢?我看不出有什么问题。

很酷,谢谢...如果需要替换空格和另一个符号,str.replace(/[+ -]/g,'');只需在中间放置空格。
2021-03-12 18:07:09
的另一个选项#|_[#_],您不妨使用+匹配任何连续匹配项以提高性能
2021-03-14 18:07:09
你的原型不起作用?你能提供一个关于小提琴的例子吗,我不断收到错误
2021-03-17 18:07:09
这么想,但你仍然帮助我理解替换表达式如何更好地工作:)
2021-04-02 18:07:09
这很酷,但我需要用不为空的空格替换下划线,我可以这样做吗?
2021-04-07 18:07:09

如果你想替换多个字符,你可以调用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

您可以在一行中替换许多:string.replace(/[#_]/g, x => ({'_': ' ', '#': ''})[x]);注意()对象周围的 - 没有它们会出错。
2021-03-13 18:07:09
@FelixGeenen 1. 你扼杀了可移植性 2. 如果你选择重新定义字符或 s,你会得到一个运行时错误,这会扼杀它的健壮性, 3. 除了纯粹的意识形态之外,没有保证保护 s 免受突变和重新绑定。很高兴看到这个片段仍然可以在新安装的 windows98 中双击/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);
2021-03-18 18:07:09
由于您使用 ES6(箭头函数),因此您也应该将其替换varconst此处。扩展浏览器支持的替代方案:var s ='234abc567bbbbac'; s = s.replace(/[abc]/g, function(m) { return {'a':'x','b':'y','c':'z'}[m]; }); console.log(s);
2021-03-26 18:07:09
@wilcro 我认为[x]应该在括号内,({'_': ' ', '#': ''}[x])而不是({'_': ' ', '#': ''})[x].
2021-03-27 18:07:09
这真的很好。谢谢。您使用对象执行 or 语句的部分是什么。您是否有文档或参考资料可以解释这一点。很好的用例。
2021-03-31 18:07:09

链接很酷,为什么要忽略它?

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

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

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

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

var replaceChars={ "#":"" , "_":" " };
string.replace(/#|_/g,function(match) {return replaceChars[match];})
@RozzA 谢谢。Object.keys 在当时还不是主流。
2021-03-23 18:07:09
采取额外的步骤:var regex = new RegExp( Object.keys(replaceChars).join("|"), "g"); string.replace(regex,function(match) {return replaceChars[match];})这使得修改 replaceChars 更容易。
2021-04-05 18:07:09
我完全忘记了替换第二个参数的替换功能选项,以帮助我记住:)
2021-04-09 18:07:09

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

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

要将一个字符替换为一件事,将不同的字符替换为另一件事,您真的无法绕过需要两次单独调用replace. 您可以像 Doorknob 那样将其抽象为一个函数,但我可能会让它采用带有旧/新的对象作为键/值对而不是平面数组。

我如何也包括哈希?
2021-04-02 18:07:09

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

所以我用

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

所以基本上如果你想减少有限数量的字符并且不要浪费时间,这将是有用的。