我正在尝试弄清楚如何使用正则表达式过滤掉字符串中的重复项,其中字符串以逗号分隔。我想在javascript中执行此操作,但我已经开始考虑如何使用反向引用。
例如:
1,1,1,2,2,3,3,3,3,4,4,4,5
变为:
1,2,3,4,5
或者:
a,b,b,said,said, t, u, ugly, ugly
变为
a,b,said,t,u,ugly
答案 0 :(得分:7)
为什么在javascript代码中使用正则表达式?这是示例代码(虽然凌乱):
var input = 'a,b,b,said,said, t, u, ugly, ugly';
var splitted = input.split(',');
var collector = {};
for (i = 0; i < splitted.length; i++) {
key = splitted[i].replace(/^\s*/, "").replace(/\s*$/, "");
collector[key] = true;
}
var out = [];
for (var key in collector) {
out.push(key);
}
var output = out.join(','); // output will be 'a,b,said,t,u,ugly'
p / s:for循环中的一个正则表达式是修剪标记,而不是使它们唯一
答案 1 :(得分:1)
如果你坚持使用RegExp,这是Javascript中的一个例子:
"1,1,1,2,2,3,3,3,3,4,4,4,5".replace (
/(^|,)([^,]+)(?:,\2)+(,|$)/ig,
function ($0, $1, $2, $3)
{
return $1 + $2 + $3;
}
);
要处理修剪空白,请稍微修改:
"1,1,1,2,2,3,3,3,3,4,4,4,5".replace (
/(^|,)\s*([^,]+)\s*(?:,\s*\2)+\s*(,|$)\s*/ig,
function ($0, $1, $2, $3)
{
return $1 + $2 + $3;
}
);
也就是说,通过split
标记并处理重复项似乎更好。
答案 2 :(得分:0)
以下是一个例子:
s/,([^,]+),\1/,$1/g;
Perl正则表达式替换,但任何知道语法的人都应该可以转换为JS风格。
答案 3 :(得分:0)
我不使用正则表达式。
这是我使用的功能。它接受包含逗号分隔值的字符串,并返回唯一值的数组,而不管原始字符串中的位置。
注意:如果您传递包含引用值的CSV字符串,则Split不会以任何不同方式处理引用值内的逗号。因此,如果您想处理真正的CSV,最好使用第三方CSV解析器。
function GetUniqueItems(s)
{
var items=s.split(",");
var uniqueItems={};
for (var i=0;i<items.length;i++)
{
var key=items[i];
var val=items[i];
uniqueItems[key]=val;
}
var result=[];
for(key in uniqueItems)
{
// Assign to output result field using hasOwnProperty so we only get
// relevant items
if(uniqueItems.hasOwnProperty(key))
{
result[result.length]=uniqueItems[key];
}
}
return result;
}
答案 4 :(得分:0)
使用javascript正则表达式
x="1,1,1,2,2,3,3,3,3,4,4,4,5"
while(/(\d),\1/.test(x))
x=x.replace(/(\d),\1/g,"$1")
1,2,3,4,5
x="a,b,b,said,said, t, u, ugly, ugly"
while(/\s*([^,]+),\s*\1(?=,|$)/.test(x))
x=x.replace(/\s*([^,]+),\s*\1(?=,|$)/g,"$1")
a,b,said, t, u,ugly
未经过充分测试,如果有任何问题请与我联系。