一个写得很好的正则表达式可以很容易地处理你的问题。引用 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");
为了让它发挥作用。
祝你今天过得愉快!