【问题标题】:find all letters without repeating regex查找所有字母而不重复正则表达式
【发布时间】:2021-11-01 04:02:03
【问题描述】:

请帮助我查找字符串中的所有字母,而无需重复使用正则表达式 JS。

示例:

let str = "abczacg";
str = str.match(/ pattern /); // return has to be: abczg

str = "aabbccdd" //return:abcd.

str = "hello world"//return: helo wrd

有可能吗?

谢谢!

【问题讨论】:

  • 我认为你不能用正则表达式来做到这一点。正则表达式匹配始终是输入字符串的连续子字符串。

标签: javascript regex string


【解决方案1】:

这是一种方法。我们可以先反转输入字符串。然后,对以下模式进行全局正则表达式替换:

(\w)(?=.*\1)

这将删除我们稍后可以在字符串中找到相同字符的任何字符。但是,由于我们将在 reversed 字符串上运行此替换,这具有删除除第一次出现之外的所有重复字母的实际效果。最后,我们再次反转剩余的字符串以达到预期的输出。

var input = "abczacg";
var output = input.split("").reverse().join("").replace(/(\w)(?=.*\1)/g, "");
output = output.split("").reverse().join("");
console.log(output);

【讨论】:

  • 聪明 :) str.split('').reverse().join('') 真的是在 JS 中反转字符串的惯用方式吗?
【解决方案2】:

不使用正则表达式的替代方法,使用Set

[
  "abczacg",
  "aabbccdd",
  "hello world"
].forEach(s => {
  console.log([...new Set(s.split(''))].join(''))
})

【讨论】:

  • 第四只鸟:您的答案可能可行,但它假定 JavaScript Set 保持字母的原始顺序。在许多语言中,情况并非如此。
  • @TimBiegeleisen 嗨,蒂姆,好点子。我可以发现Set 保留了插入顺序。如果我的解释正确,当将数组传递给 Set constructor 时,它将为每个项目调用 add
  • 那么这是一个很好的方法+1,可能比我的性能更好。
猜你喜欢
  • 2017-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-26
相关资源
最近更新 更多