正则表达式删除重复的所有字符

时间:2016-01-02 18:23:58

标签: javascript regex

我正在寻找一个将删除字符串中重复的所有字符的正则表达式。我已经使用循环解决了这个问题。只是想知道是否有正则表达式可以做同样的事情。

这是我到目前为止所做的:

function onlyUnique(str) {
  var re = /(.)(?=.*\1)/g
  return str.replace(re, '');
}

此字符串:

"rc iauauc!gcusa_usdiscgaesracg"

应该最终:

" !_de"

5 个答案:

答案 0 :(得分:3)

您可以Array#filterArray#indexOfArray#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)

如果你想用正则表达式做,你可以在替换中使用你自己的正则表达式和回调函数。

&#13;
&#13;
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;
&#13;
&#13;

这个想法是:获取重复的字符,并将其从输入字符串中删除。请注意,如果字符可能是特殊的正则表达式元字符,则必须转义(因此,使用g1.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"))。

另一个想法属于Washington Guedes中的his deleted answer,我只是在这里添加自己的实现(从字符类中删除重复的符号并转义特殊的正则表达式字符):

&#13;
&#13;
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;
&#13;
&#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, '');
}