JavaScript - 重复字符的动态正则表达式

标签 javascript regex

我对编程非常陌生,我正在尝试解决一个练习,根据组成字符是否​​出现两次或多次来对字符串(在本例中为单个单词)进行编码。仅出现一次的字符会编码为“■”,编码两次或多次的字符会编码为“X”。

示例:输入=“hippodrome”::输出=“■■XXX■■X■■”

我设法使用嵌套循环和key:value以一种非常复杂的方式解决了这个问题。对象存储 character:occurrences ,但我正在尝试使用动态创建的正则表达式重构解决方案以提高效率,但我认为我不理解正则表达式表示法。

function encodeDupes(word) {
  let encoded = "";
  for (let char of word) {
    let regex = new RegExp(char + "{2,}","ig"); // create a regex to see if "char" occurs 2 or more times
    regex.test(word) ? encoded += "X" : encoded += "■"; // check this char against rest of word, push appropriately
  }
  return encoded;
}

它适用于更简单的门,例如 char < "m" ? do X : do Y ,我以为我理解了这个答案 here ( {n,} = 至少 n 出现),但我还不够新,我仍然不确定这是我的正则表达式还是我的逻辑。

谢谢!

最佳答案

I'm very new to programming, ..., I am trying to refactor the solution to be more efficient using a dynamically created RegExp...

这有点像第 22 条陷阱,因为正则表达式为了方便而牺牲了效率。为了使正则表达式“引擎”运行,必须建立语法,并且词法分析器、解析器和求值器将基于字符串的输入表达式转换为程序输出。使用正则表达式实现特定程序(有时)很方便,但几乎不可能击败不被正则表达式引擎减慢速度的基本算法。

I managed to solve it in a very convoluted way using nested loops and a key:value object storing character:occurrences ...

确实很复杂,但遗憾的是,即使是“专家”程序员也会做这样的事情。当我们意识到不需要计算每个字母时,一种有效的算法就会出现。相反,我们只需要知道某个字母是否出现多次。使用两个Set对象,一次更多,我们可以确定答案,而不需要为每个字母分配计数器内存!由于 O(1) 恒定时间查找,集合速度快如闪电 -

function encodeDupes(word)
{ const once = new Set
  const more = new Set
  
  for (const c of word)
    if (more.has(c))
      continue
    else if (once.has(c))
      (once.delete(c), more.add(c))
    else
      once.add(c)
      
  return Array
    .from(word, c => more.has(c) ? "X" : "■")
    .join("")
}

console.log(encodeDupes("hippodrome"))

输出

■■XXX■■X■■

关于JavaScript - 重复字符的动态正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63947761/

相关文章:

javascript - 不包含字符组的字符串

regex - 如何在postgresql中将所有首字母转换为大写

javascript - 如何在子目录中包含nodejs模块

java - 正则表达式 replaceAll 的问题

javascript - 在多行中应用的 Jquery 类使其仅在一行中应用

javascript - WebAssembly 链接错误模块 ="env"

java - 如何解析可以包含转义双引号的双引号分隔字符串

javascript - JS RegEx 即使应该匹配也不匹配

javascript - keyup(function()) ajax 请求延迟 - jQuery

javascript - 如何使用 JavaScript 解析 &lt;script&gt; 中的内容?