[英]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#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);
你的正则表达式搜索重复的字符对,只删除第一个字符。 因此,不会删除最新的副本。
要解决此问题,您应该同时删除所有重复项,但我认为您不能通过单个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.