Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 用正则表达式将多个字符替换为一个字符_Javascript_String - Fatal编程技术网

Javascript 用正则表达式将多个字符替换为一个字符

Javascript 用正则表达式将多个字符替换为一个字符,javascript,string,Javascript,String,我有这个字符串: var str = '#this #is____#a test###__' 我想用(#)替换所有字符(#,z),因此例外输出为: '#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###__'
我想用(#)替换所有字符(#,z),因此例外输出为:

'#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)

那么我如何才能获得我的例外输出呢?

您的正则表达式将任何匹配字符的单个实例替换为您指定的字符,即
。您需要添加修饰符
+
,告诉它应该替换任意数量的连续匹配字符(,#),而不是单独替换每个字符<代码>+修饰符表示一次匹配一个或多个指定图案。您可以从本页阅读有关修改器的更多信息:

var str='#这是一个测试######;
var formattedStr=str.replace(/[###,]+/g,'.#');

console.log(formattedStr)编写良好的正则表达式可以相当容易地处理您的问题。 引用Mohit的答案,有一个起点:

var str = '#this #is__ __#a test###__';
var formattedStr = str.replace(/[#_,]+/g, '#');
console.log( formattedStr );
第2行:
在formattedStr中输入str上替换方法的结果。
替换是如何工作的?第一个参数是字符串或正则表达式。
注意:Javascripts中的RegExp是RegExp类型的对象,而不是字符串。这么写

/yourRegex/

是等价的语法。 现在让我们来讨论这个特殊的正则表达式本身。
前导和尾随斜杠用于环绕图案,结尾的g表示“全局”-第一次匹配后不要停止。
方括号描述了可以提供的一组字符以匹配模式,而+号表示“该组中的一个或多个字符”。
基本上,################会匹配,但也会匹配,因为#和#属于同一组。
通过使用(#|))+
给出首选行为 这意味着“#或",一旦找到一个,继续期待更多或选择的模式”。
所以uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu 另一个问题是不知道如何用a或a替换找到的模式。
幸运的是,使用括号可以让我们使用一种叫做捕获组的东西。基本上,您可以存储在临时变量中找到的任何模式,这些模式可以在替换模式中使用。
调用它们很容易,将$置于匹配(模式)的位置。
/(foo)textnotgetting(bar)captured(baz)/例如,通过以下方式填充捕获组“变量”:

$1 = foo
$2 = bar
$3 = baz
在我们的例子中,我们只想用第一次出现的字符替换1+字符,括号中不包括+符号
所以我们可以简单地

str.replace("/(#|_)+/g", "$1");
为了让它工作。


祝你今天愉快

您应该使用
+
匹配上一组的一个或多个匹配项

var str='#这是一个测试####
str=str.replace(/[###]+/g,'.#')

警报(str)
您在正则表达式中缺少
+
+
表示1个或多个字符,因此它将捕获多个字符,而不仅仅是1个字符。replace(/[\u]+/g,”)。replace(/[\u35;]{2,}/g,”)
它可以像您所说的那样工作@Rajesh先生,谢谢您的解释。请记住,你是在回答读者的问题,而不仅仅是OpThank@Rajesh,我已经添加了一些解释。
str.replace("/(#|_)+/g", "$1");