我有这个字符串:
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#####
我尝试将(*)用于序列但是没有用:
var str = '#this #is__ __#a test###__'
str = str.replace(/[#_]*/g,'#')
alert(str)
那我怎么能得到我的例外输出?
答案 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)