繁体   English   中英

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

[英]Regex to remove all characters that are repeated

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

这是我到目前为止:

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

这个字符串:

"rc iauauc!gcusa_usdiscgaesracg"

应该最终这样:

" !_de"

您可以使用Array#filter with Array#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); 

你的正则表达式搜索重复的字符对,只删除第一个字符。 因此,不会删除最新的副本。

要解决此问题,您应该同时删除所有重复项,但我认为您不能通过单个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

好吧,不知道正则表达式是否可以做到这一点,但你可以使用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

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

 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 + "'"; 
 <div id="r"/> 

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

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

 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 + "'"; 
 <div id="r2"/> 

注意 :如果您还想支持换行符号,请替换. 在正则表达式模式中使用[^][\\s\\S]

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM