我有一些像11122_11255_12_223_12
这样的字符串
我希望得到的输出是:12_125_12_23_12
我已经看过this和also 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),我只想保留其中之一。
谢谢。
答案 0 :(得分:6)
您可以使用捕获组和反向引用:
result = str.replace(/(.)\1+/g, '$1')
(.)
:匹配任何字符并在#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));