使用正则表达式删除逗号分隔列表中的重复项?

时间:2010-01-12 03:20:19

标签: javascript regex

我正在尝试弄清楚如何使用正则表达式过滤掉字符串中的重复项,其中字符串以逗号分隔。我想在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

5 个答案:

答案 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

未经过充分测试,如果有任何问题请与我联系。