如何在javascript中用一个字符替换多个字符?

时间:2017-04-17 06:15:51

标签: javascript string

我有这个字符串:

var str = '#this #is____#a test###__'

我想用(#)替换所有字符(#,_),所以例外输出是:

'#this #is#a test#'

注意: 我不知道字符串

中有多少(#)或(_)序列 我尝试了什么:

我试着写:

var str = '#this #is__ __#a test###__'
str = str.replace(/[#_]/g,'#')
alert(str)

但输出是:

#this #is## ###a test#####

my try online

我尝试将(*)用于序列但是没有用:

var str = '#this #is__ __#a test###__'
str = str.replace(/[#_]*/g,'#')
alert(str)

那我怎么能得到我的例外输出?

3 个答案:

答案 0 :(得分:2)

一个写得很好的RegEx可以很容易地处理你的问题。 引用Mohit的答案来获得一个起点:

var str = '#this #is__ __#a test###__';
var formattedStr = str.replace(/[#_,]+/g, '#');
console.log( formattedStr );

第2行:
将格式化的str放入str。的替换方法的结果 更换如何工作?第一个参数是字符串或RegEx 注意:Javascripts中的RegExps是RegExp类型的对象,而不是字符串。所以写作

/yourRegex/

New RegExp('/yourRegex/')

是等效的语法。 现在让我们讨论一下这个特殊的RegEx本身 前导斜杠和尾部斜杠用于包围模式,末尾的g表示“全局” - 在第一次匹配后不会停止。
方括号描述了一组可以提供以匹配模式的字符,而+符号表示“此组中的一个或多个”。
基本上,###会匹配,但 ### _#会,因为_和#属于同一组。
通过使用(#| _)+
给出优选的行为 这意味着“#或_,然后,一旦找到,继续期待更多或选择的模式” 所以___会匹配,以及####会,但__ ##将是2个不同的匹配组(前者为__,后者为##)。
另一个问题是不知道用_或#来替换找到的模式 幸运的是,使用括号允许我们使用称为捕获组的东西。您基本上可以存储在临时变量中找到的任何模式,可以在替换模式中使用 调用它们很容易,将$支付到匹配(模式)的位置 /(foo)textnotgetting(bar)捕获(baz)/例如以这种方式填充捕获组“变量”:

$1 = foo
$2 = bar
$3 = baz

在我们的例子中,我们希望仅用第一个匹配项替换1+个字符,并且括号中不包含+符号!
所以我们可以简单地

str.replace("/(#|_)+/g", "$1");

为了使其发挥作用。

祝你有愉快的一天!

答案 1 :(得分:1)

您的正则表达式将任何匹配字符的单个实例替换为您指定的字符,即#。您需要添加修饰符+来告诉它应该替换任意数量的连续匹配字符(_,#)而不是单独替换每个字符。 +修饰符表示一次匹配一次或多次指定模式。您可以从此页面了解有关修饰符的更多信息:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp



var str = '#this #is__ __#a test###__';
var formattedStr = str.replace(/[#_,]+/g, '#');
console.log( formattedStr );




答案 2 :(得分:0)

您应该使用+来匹配上一个组的一个或多个实例。

var str = '#this #is__ __#a test###__'
str = str.replace(/[#_]+/g,'#')
alert(str)