我有一些像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),我想保留其中一个。
谢谢。
您可以使用捕获组和反向引用:
result = str.replace(/(.)\1+/g, '$1')
(.)
:匹配组#1中的任何角色和捕获\1+
:匹配1 +字符与捕获组#1相同我非常喜欢正则表达式解决方案。但是,我想到的第一件事是用char循环检查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);
如果您以非正则表达式方式进行设置,则可以在_
上拆分项目,然后通过创建一个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)