I have some string like 11122_11255_12_223_12
and the output I wish to have is this: 12_125_12_23_12
I already looked at this and also this a
If you are intersted in a non-regex way, you can split the items on the _
, and then map that by creating a Set
of characters which will remove duplicates. Then you just join the data back together. Like this:
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)
I really like the regex solution. However, first thing which would come into my mind is a checking char by char with a loop:
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);
Easy and recursive way
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));
You can use capture group and back-reference:
result = str.replace(/(.)\1+/g, '$1')
RegEx Demo
(.)
: Match any character and capture in group #1\1+
: Match 1+ characters same as in capture group #1