我正在寻找一个将删除字符串中重复的所有字符的正则表达式。我已经使用循环解决了这个问题。只是想知道是否有正则表达式可以做同样的事情。
这是我到目前为止所做的:
function onlyUnique(str) {
var re = /(.)(?=.*\1)/g
return str.replace(re, '');
}
此字符串:
"rc iauauc!gcusa_usdiscgaesracg"
应该最终:
" !_de"
答案 0 :(得分:3)
您可以Array#filter
与Array#indexOf
和Array#lastIndexOf
一起使用来检查元素是否重复。
var str = "rc iauauc!gcusa_usdiscgaesracg";
// Split to get array
var arr = str.split('');
// Filter splitted array
str = arr.filter(function (e) {
// If index and lastIndex are equal, the element is not repeated
return arr.indexOf(e) === arr.lastIndexOf(e);
}).join(''); // Join to get string from array
console.log(str);
document.write(str);

答案 1 :(得分:1)
你的正则表达式搜索重复的字符对,只删除第一个字符。因此,最新的副本不会被删除。
要解决此问题,您应该同时删除所有重复项,但我不认为您可以使用单个replace
执行此操作。
相反,我会构建一个计算每个字符出现次数的映射,然后再次迭代字符串,将只出现一次的字符推送到一个新字符串:
function onlyUnique(str) {
var map = Object.create(null);
for(var i=0; i<str.length; ++i)
map[str[i]] = (map[str[i]] || 0) + 1;
var chars = [];
for(var i=0; i<str.length; ++i)
if(map[str[i]] === 1)
chars.push(str[i]);
return chars.join('');
}
与indexOf
不同,哈希映射中的搜索平均不变。因此,使用n
字符串的通话费用为n
。
答案 2 :(得分:1)
好吧,不知道正则表达式是否可以做到这一点,但你可以使用for循环来解决它,例如:
function unikChars(str) {
store = [];
for (var a = 0, len = str.length; a < len; a++) {
var ch = str.charAt(a);
if (str.indexOf(ch) == a && str.indexOf(ch, a + 1) == -1) {
store.push(ch);
}
}
return store.join("");
}
var str = 'rc iauauc!gcusa_usdiscgaesracg';
console.log(unikChars(str)); //gives !_de
演示:: jsFiddle
答案 3 :(得分:1)
如果你想用正则表达式做,你可以在替换中使用你自己的正则表达式和回调函数。
var re = /(.)(?=.*\1)/g;
var str = 'rc iauauc!gcusa_usdiscgaesracg';
var result = str;
str.replace(re, function(m, g1) {
result = result.replace(RegExp(g1.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "g"), '');
});
document.getElementById("r").innerHTML = "'" + result + "'";
&#13;
<div id="r"/>
&#13;
这个想法是:获取重复的字符,并将其从输入字符串中删除。请注意,如果字符可能是特殊的正则表达式元字符,则必须转义(因此,使用g1.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")
)。
另一个想法属于Washington Guedes中的his deleted answer,我只是在这里添加自己的实现(从字符类中删除重复的符号并转义特殊的正则表达式字符):
var s = "rc iauauc!gcusa_u]sdiscgaesracg]";
var delimiters= '[' + s.match(/(.)(?=.*\1)/g).filter(function(value, index, self) { // find all repeating chars
return self.indexOf(value) === index; // get unique values only
}).join('').replace(/[.*+?^${}()|[\]\\]/g, "\\$&") + ']'; // escape special chars
var regex = new RegExp(delimiters, 'g'); // build the global regex from the delimiters
var result = s.replace(regex, ''); // obtain the result
document.getElementById("r2").innerHTML = "'" + result + "'";
&#13;
<div id="r2"/>
&#13;
注意:如果您还想支持换行符号,请将.
替换为正则表达式模式中的[^]
或[\s\S]
。
答案 4 :(得分:0)
function onlyUnique(str) {
// match the characters you want to remove
var match = str.match(/(.)(?=.*\1)/g);
if (match) {
// build your regex pattern
match = '[' + match.join('') + ']';
}
// if string is already unique return the string
else {
return str
}
// create a regex with the characters you want to remove
var re = new RegExp(match, 'g');
return str.replace(re, '');
}