2010-01-12 17 views
5

Estoy tratando de averiguar cómo filtrar los duplicados en una cadena con una expresión regular, donde la cadena está separada por comas. Me gustaría hacer esto en JavaScript, pero me estoy poniendo al día sobre cómo usar las referencias anteriores.¿Eliminar duplicados en una lista separada por comas con una expresión regular?

Por ejemplo:

1,1,1,2,2,3,3,3,3,4,4,4,5 

se convierte en:

1,2,3,4,5 

O:

a,b,b,said,said, t, u, ugly, ugly 

Se convierte en

a,b,said,t,u,ugly 

Respuesta

8

¿Por qué utilizar regex cuando puede hacerlo en el código de javascript? Aquí es código de ejemplo (desordenado sin embargo):

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: que una expresión regular en el bucle para es recortar las fichas, no para que sean únicos

+1

+1; esto tiene la ventaja adicional de eliminar duplicados, incluso si no son contiguos. Algo que sería extremadamente difícil si no es imposible hacerlo en una expresión regular. –

+0

Las expresiones regulares a menudo son mucho más elegantes para los problemas que pueden resolver fácilmente.¿Qué es preferible: una docena de líneas de código o una docena de caracteres de expresiones regulares? –

+0

Te recomendaría que compruebes si 'collector.hasOwnProperty (key)' dentro de tu bucle 'for ... in', porque si alguien extiende el' Object.prototype' romperá tu código. – CMS

0

Aquí está un ejemplo:

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

Perl sustitución de expresiones regulares, pero debe ser convertible a JS-estilo por cualquier persona que conozca la sintaxis.

+0

Tenga en cuenta que esto no funciona del todo correctamente alrededor del inicio de la cadena; podría solucionarlo, pero eso podría oscurecer cómo funciona el núcleo de la expresión regular. Lo cual es algo malo, porque termina animando a la gente a copiar y pegar sin comprender. –

+0

Luego, debe ayudar a las personas a comprender explicando –

1

Si insiste en RegExp, aquí está un ejemplo en 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; 
    } 
); 

Para manejar el recorte de espacios en blanco, modificar ligeramente:

"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; 
    } 
); 

dicho esto, s eems mejor para tokenizar a través de split y manejar duplicados.

0

No uso expresiones regulares para eso.

Aquí está la función que uso. Acepta una cadena que contiene valores separados por comas y devuelve una matriz de valores únicos, independientemente de la posición en la cadena original.

Nota: Si pasa cadena CSV que contiene los valores entrecomillados, Split no tratará las comas dentro de los valores entre comillas de manera diferente. Por lo tanto, si desea manejar CSV real, es mejor utilizar un analizador CSV de terceros.

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; 
} 
0

con 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 

no muy probado, quiero saber si hay algún problema.

Cuestiones relacionadas