我想弄清楚如何用正則表達式過濾掉字符串中的重複項,其中字符串用逗號分隔。我想用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來做到這一點,但我正在趕上如何使用反向引用。使用正則表達式刪除逗號分隔列表中的重複項?
例如:
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循環一個正則表達式是修剪標記,不使他們獨特
這裏有一個例子:
s/,([^,]+),\1/,$1/g;
Perl的正則表達式替換,而應該是由誰知道語法轉換爲JS-風格。
請注意,在字符串的開始處這並不正確 - 我可以修復這個問題,但這會掩蓋正則表達式本身的核心工作方式。這是一件壞事,因爲它最終會鼓勵人們不理解地複製粘貼。 – 2010-01-12 03:25:15
然後,您應該通過解釋 – 2011-09-17 23:20:57
如果堅持正則表達式,這裏的在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
來標記,並處理重複。
我不使用正則表達式。
這是我使用的功能。它接受一個包含逗號分隔值的字符串,並返回一個唯一值數組,無論原始字符串中的位置如何。
注意:如果您傳遞包含帶引號的值的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;
}
用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
沒有很好的測試,讓我知道,如果有任何問題。
+1來幫助人們理解,即使它們不是連續的,也可以刪除重複項。如果在正則表達式中不可能做到某些事情會非常困難。 – 2010-01-12 03:46:07
雖然正則表達式對於他們可以輕鬆解決的問題來說通常要優雅得多。哪一個更可取 - 十幾行代碼或十幾個字符的正則表達式? – 2010-01-12 03:49:32
我建議你檢查''collector.hasOwnProperty(key)'在'for ... in'循環中,因爲如果有人擴展了'Object.prototype',它會破壞你的代碼。 – CMS 2010-01-12 04:19:07