【问题标题】:Replace multiple consecutive characters with their last occurrence将多个连续字符替换为其最后一次出现
【发布时间】:2020-08-31 09:40:50
【问题描述】:

当输入3*+8 时,答案应该是11,当输入9+*/3 时,答案应该是3

代码:

operation=()=>{
   this.setState({ result:(eval(this.state.result.replace(/[-+\/*]/gm, "$1"))||"")+""})}
        

【问题讨论】:

  • 试试.replace(/([-+\/*])+/g, "$1")
  • 当我尝试使用 3*+8=24 的答案时,但我希望答案是 11
  • eval("3*+8".replace(/([-+\/*])+/g, "$1")) => 11

标签: javascript reactjs regex


【解决方案1】:

您可以匹配一个或多个 +-/* 数学运算符的连续,并将它们替换为最后一次出现:

.replace(/([-+\/*])+/g, "$1")

这里,([-+\/*])+ 是一个重复捕获组,它匹配并捕获组 1 中的四个字符中的任何一个,并且只将最后一次迭代期间捕获的最后一个字符保留在组内存缓冲区中。 $1 反向引用将整个匹配替换为该字符。

请参阅regex demo

const strs = ["3*+8", "9+*/3"];
const rx = /([-+\/*])+/g;
for (const s of strs) {
  console.log(s, '=>', eval(s.replace(rx, "$1")));
}

【讨论】:

  • 这是repeated capturing group 的一个很好的用法,它经常被错误地用于获取多个匹配项。似乎 / 在这个正则表达式中可以不转义。
  • 是的,在大多数情况下,/ 可以在字符类中保持不转义。它不适用于 IE 和旧浏览器版本。
猜你喜欢
  • 1970-01-01
  • 2019-02-08
  • 1970-01-01
  • 2011-07-26
  • 2020-03-05
  • 1970-01-01
  • 1970-01-01
  • 2011-04-19
相关资源
最近更新 更多