在JavaScript中删除字符串中连续的重复字符

10
我有一些字符串,例如11122_11255_12_223_12,我希望得到的输出是这样的:12_125_12_23_12
我已经查看了这个这个等等,但都不符合我上述的要求。
实际上,我用这里的代码来实现我的目标,但是似乎有些问题。
以下是我的代码:
var str='11222_12_111_122_542_1212333_122';
var result = str.replace(/(1{2,}|2{2,}|3{2,}|4{2,}|5{2,}|6{2,}|7{2,}|8{2,}|9{2,})/g,'$1');
console.log(result);

它并没有起作用,输出和输入完全一样。

如我上面所述,我有一些字符串,例如11122_11255_12_223_12,我希望得到的输出是:12_125_12_23_12,这意味着在下划线之间是一个数字,并且对于每个数字,如果有两个或更多连在一起的数字(如223有两个2),我只想保留其中一个。
谢谢。

5个回答

29

您可以使用捕获组和反向引用:

result = str.replace(/(.)\1+/g, '$1')

RegEx演示

  • (.): 匹配任意字符并捕获在第一组中
  • \1+: 匹配与第一组相同的1个或多个字符

1
$1 是什么意思? - Andrés Montoya
这是对捕获组1的后向引用。 - anubhava

2

我非常喜欢正则表达式的解决方案。然而,我首先想到的是使用循环逐个字符检查:

Original Answer翻译成"最初的回答"

const str = "11122_11255_12_223_12";
let last = "";
let result = "";
for(let i = 0; i < str.length; i++){
  let char = str.charAt(i);
  if(char !== last){
    result += char;
    last = char;
  }
}
console.log(result);


1
function removeAdjacentDuplicates(str) {
    let newStr = '';
    for (let i = 0; i < str.length; i++) {
        if (str[i] !== str[i + 1])
            if (str[i - 1] !== str[i])
                newStr += str[i];
    }
    return newStr;
}

也许你可以对你的解决方案进行一些解释,以帮助其他人理解你所做的事情。 - René Höhle

1
如果您对非正则表达式的方式感兴趣,您可以通过在_上拆分项目,然后通过创建一个字符的Set来映射,该字符将删除重复项。然后,您只需将数据重新连接即可。像这样:

var str = '11122_11255_12_223_12';
let result = str
  // Split on the underscore
  .split('_')
  // map the list
  .map(i =>
    // Create a new set on each group of characters after we split again
    [...new Set(i.split(''))].join('')
  )
  // Convert the array back to a string
  .join('_')

console.log(result)


1

简单且递归的方法

let x = "11122_11255_12_223_12".split('');
let i = 0;
let j = 1;

function calc(x) {
  if (x[i] == x[j]) {
    x.splice(j, 1);
    calc(x);
  }
  
  if (j == x.length) {
    return x.join('');
  }
  
  i += 1;
  j += 1;
  calc(x);
}
console.log(calc(x));


如何创建可运行的堆栈片段? - adiga

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接