regex 有没有一种方法可以删除字符串中特定的重复字符?

7uhlpewt  于 2023-06-30  发布在  其他
关注(0)|答案(4)|浏览(118)

我得到了一个简单的字符串,其中有一些重复的字符。有人可以请帮助我修复下面的表达式,以删除不仅重复的字符,但所有字符有超过1次出现。

console.log('aaabbxxstring'.replace(/(.)(?=.*?\1)/g,'')); // string

我正在使用lookahead捕获一个匹配字符,并将匹配替换为空格。问题是如何替换捕获组本身。还是整个方法都不正确?

dm7nw8vv

dm7nw8vv1#

当您围绕字符分割字符串时,使用结果数组的长度对出现次数进行计数。

str.split(c).length

给你的次数加1。
将字符串转换为数组,使用出现的情况进行过滤,连接到String。

var str = 'aaabxbxxstring';

const count = (str, c) => str.split(c).length - 1

str = [...str].filter(c => count(str,c) < 2).join('')

console.log(str);
zy1mlcev

zy1mlcev2#

console.log('aaabbxxstring'.replace(/(.)\1+/g, '')); // string

说明:

(.) captures a single character.
\1+ matches one or more occurrences of the captured character.
/g performs a global search to replace all occurrences.
bf1o4zei

bf1o4zei3#

我认为regex是错误的工具。您需要先计算每个字符在字符串中出现的次数,然后才能决定要删除哪些字符。
使用Map来记录字符串中遇到的字符数可能更容易。
示例:

var str = 'aaabxbxxstringaaa';
var map = new Map();

// loop over all the characters and count how many times each character occurs
for(let ch of str) {
  let count = map.get(ch);
  count = count ? count : 0;
  map.set(ch, count + 1);
}

// remove characters occuring more than once:
for(let [ch, count] of map) {
  if(count > 1) {
    str = str.replaceAll(ch, '');
  }
}

console.log(str);

免责声明:我不习惯JavaScript,所以可能有更惯用的方法来做到这一点。

wz8daaqr

wz8daaqr4#

RegEx不是合适的工具,但无论如何,这里有一个思想实验:)

const s = 'aaabbxxstringnnnhello'
const pattern = /(.)(?!.*\1)/g
console.log(s.match(pattern).join('')); // abxstrignhelo

相关问题