删除字符串javascript中的连续重复字符

时间:2019-04-11 15:53:09

标签: javascript regex

我有一些像11122_11255_12_223_12这样的字符串 我希望得到的输出是:12_125_12_23_12
我已经看过thisalso this
但是上面没有我想要的。

实际上,我出于目的使用了here,但是出了点问题。

这是我的代码:

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 个答案:

答案 0 :(得分:6)

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

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

RegEx Demo

  • (.):匹配任何字符并在#1组中捕获
  • \1+:匹配1个以上的字符,与捕获组#1相同

答案 1 :(得分:1)

我真的很喜欢正则表达式解决方案。但是,我想到的第一件事是通过循环逐个字符地检查char:

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);

答案 2 :(得分: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)

答案 3 :(得分: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;
}

答案 4 :(得分:0)

简便且递归的方式

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));