簡體   English   中英

使用正則表達式刪除逗號分隔列表中的重復項?

[英]Removing duplicates in a comma-separated list with a 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

當您可以在 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 循環中的一個正則表達式是修剪標記,而不是使它們唯一

如果您堅持使用 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和處理重復來標記化似乎更好。

下面是一個例子:

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

Perl 正則表達式替換,但任何知道語法的人都應該可以轉換為 JS 樣式。

我不使用正則表達式。

這是我使用的功能。 它接受一個包含逗號分隔值的字符串,並返回一個唯一值數組,而不考慮原始字符串中的位置。

注意:如果您傳遞包含引用值的 CSV 字符串,Split 不會以任何不同的方式處理引用值中的逗號。 因此,如果您想處理真正的 CSV,最好使用第 3 方 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;
}

使用 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

沒有經過很好的測試,如果有任何問題,請告訴我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM