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

IT技术 javascript string
2021-03-11 08:45:13

我有这个字符串:

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)

那么我如何获得例外输出?

3个回答

一个写得很好的正则表达式可以很容易地处理你的问题。引用 Mohit 的回答以获得一个起点:

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

第 2 行:
将替换方法的结果放入 formattedStr。
替换如何工作?第一个参数是字符串或正则表达式。
注意:Javascript 中的 RegExp 是 RegExp 类型的对象,而不是字符串。所以写

/yourRegex/

或者

New RegExp('/yourRegex/')

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

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

在我们的例子中,我们只想用第一次出现替换 1+ 个字符,并且括号中不包含 + 符号!
所以我们可以简单地

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

为了让它发挥作用。

祝你今天过得愉快!

您的正则表达式将任何匹配字符的单个实例替换为您指定的字符 ie #您需要添加修饰符+来告诉它应该替换任意数量的连续匹配字符 (_,#) 而不是单独替换每个字符。+修饰符意味着一次性匹配 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 );

谢谢@Rajesh 我已经添加了一些解释。
2021-05-07 08:45:13
缺少解释。请记住,您是在为读者而不是 OP 回答
2021-05-21 08:45:13

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

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