2012-03-31 27 views
0

Angenommen, wir haben eine Zeichenfolge wie folgt aus:Entfernen Sie doppelte Kommas und zusätzliche Kommas am Anfang/Ende mit RegExp in Javascript, und entfernen Sie doppelte Zahlen?

,34,23,4,5,634,23,12,5,4,3,1234,23,54,,,,,,,123,43,2,3,4,5,3424,,,,,,,,123,,,1234,,,,,,,45,,,56 

Wie können wir es auf die folgende Zeichenfolge mit RegExp in Javascript konvertieren?

34,23,4,5,634,12,3,1234,54,123,43,2,3424,45,56 

Eigentlich möchte ich , char wiederholte Elemente und erste und letzte entfernen

+3

uh, wo hat die "34" gehen? –

+0

@SamuelEdwinWard es muss sowieso über Bord XD gesprungen sein, ich denke RegExp ist nicht das Werkzeug für diesen Job. Ich denke, du solltest es stattdessen analysieren. – Joseph

+0

Ich stimme zu, dass es nicht das richtige Werkzeug für den Job ist; Etwas, das mit der "Split" -Methode auf Strings beginnt, ist wahrscheinlich der Weg zu gehen. –

Antwort

4

[bearbeitet] Um diese in eine Reihe von einzigartigen Zahlen zu drehen, wie Sie tatsächlich haben wollen, dies zu tun:

function scrapeNumbers(string) { 
    var seen = {}; 
    var results = []; 
    string.match(/\d+/g).forEach(function(x) { 
     if (seen[x]===undefined) 
      results.push(parseInt(x)); 
     seen[x] = true; 
    }); 
    return results; 
} 

Demo:

> scrapeNumbers(',1,22,333,22,,333,4,,,') 
[1, 22, 333, 4] 

Wenn Sie einehatteprimitive, könnte man es so schreiben, so in einer Zeile:

yourString.match(/\d+/g).map(parseBase10).unique() 

Leider müssen Sie ein bisschen ausführlicher sein und definieren Sie Ihre eigenen parseBase10 = function(n){return parseInt(n)} aufgrund dieser lächerlich schwer zu Track-down bug: javascript - Array#map and parseInt

+0

Das wird doppelte Kommas ganz schön entfernen, aber ich glaube, der Fragesteller möchte auch doppelte Zahlen entfernen. –

+1

@SamuelEdwinWard: Oh, interessant, du solltest die schlechte Frage dann lieber als downvoting bearbeiten ;-) – ninjagecko

+0

Ich stimme zu, die Frage ist nicht sehr gut angegeben, aber hast du es gelesen? Produziert Ihr Code etwas, das seinem Beispiel ähnelt? –

1

Keine Notwendigkeit für Regex. Ein paar Tricks

text = ',34,23,4,5,634,23,12,5,4,3,1234,23,54,,,,,,,123,43,2,3,4,5,3424,,,,,,,,123,,,1234,,,,,,,45,,,56'; 
text = text.replace(/,+/g, ','); //replace two commas with one comma 
text = text.replace(/^\s+|\s+$/g,''); //remove the spaces 
textarray = text.split(","); // change them into array 
textarray = textarray.filter(function(e){ return e.length}); 
console.log(textarray);          


// Now use a function to make the array unique 
Array.prototype.unique = function(){ 
    var u = {}, a = []; 
    for(var i = 0, l = this.length; i < l; ++i){ 
     if(this[i] in u) 
     continue; 
     a.push(this[i]); 
     u[this[i]] = 1; 
    } 
    return a; 
} 

textarray = textarray.unique(); 
text = textarray.join(','); //combine them back to what you want 
console.log(text); 

Demo

Wenn Sie familier mit jQuery

text = text.replace(/,+/g, ','); 
text = $.trim(text); 
text = $.unique(text.split(",")).filter(function(e){ return e.length}).join(","); 
console.log(text); 

Demo

+0

Guter Herr, dass phpjs Code wirklich schrecklich ist. Dein Vorschlag ist im Grunde richtig, aber niemand sollte dieses Zeug benutzen; Es scheint von jemandem geschrieben worden zu sein, der mit JavaScript nur wenig vertraut ist. – Pointy

+0

@ Pointy, In diesem Fall, mit einer Prototyp-Funktion aktualisiert. Hoffe du magst es. – Starx

+0

Die Prototyp-Funktion ist völlig in Ordnung. Wird die leere Zeichenkette auch nicht in die Ergebnisse eingeschlossen und zu einer beliebigen Position rekombiniert? – ninjagecko

0

Dies wird es tun:

function arrIndex(fnd, arr) { 
    for (var len = arr.length, i = 0; i < len; i++) { 
     if (i in arr && arr[i] === fnd) { 
      return i; 
     } 
    } 
    return -1; 
} 

function scrapeNumbers(str) { 
    var arr = str.replace(/,+/g, ",").replace(/^,/, "").replace(/,$/, "").split(","); 

    for (var i = 0, len = arr.length, rtn = []; i < len; i++) { 
     if (i in arr && arrIndex(arr[i], rtn) == -1) { 
      rtn.push(arr[i]); 
     } 
    } 
    return rtn.join(","); 
} 

var str = ",,34,23,4,5,634,23,12,5,4,3,1234,23,54,,,,,,,123,43,2,3,4,5,3424,,,,,,,,123,,,1234,,,,,,,45,,,56,,"; 

alert(scrapeNumbers(str)); 

Hier ist ein jsFiddle

Hinweis: Ich habe eine benutzerdefinierte array.indexOf Funktion für ein besseres browser support

Verwandte Themen