代码之家  ›  专栏  ›  技术社区  ›  Geuis

用regex删除逗号分隔列表中的重复项?

  •  5
  • Geuis  · 技术社区  · 16 年前

    我正试图找出如何用正则表达式过滤字符串中的重复项,其中字符串是逗号分隔的。我想用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 回复  |  直到 16 年前
        1
  •  7
  •   Lukman    16 年前

    当您可以在javascript代码中使用regex时,为什么要使用它?下面是示例代码(尽管很混乱):

    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循环中的一个regex是为了修剪标记,而不是使它们唯一

        2
  •  1
  •   K Prime    16 年前

    如果您坚持使用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 并处理重复项。

        3
  •  0
  •   Anon.    16 年前

    举个例子:

    s/,([^,]+),\1/,$1/g;
    

    PerlRegex替换,但是任何了解语法的人都应该可以将其转换为JS样式。

        4
  •  0
  •   Ash    16 年前

    我不使用正则表达式。

    这是我使用的功能。它接受一个包含逗号分隔值的字符串,并返回一个唯一值数组,而不考虑原始字符串中的位置。

    注意:如果传递包含带引号的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;
    }
    
        5
  •  0
  •   YOU    16 年前

    使用javascript regex

    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
    

    测试不好,如果有问题请告诉我。