2010-11-23 7 views
0

Ich muss zwei Zeichenfolgen als gleichwertig bewerten, auch wenn sie kleine Interpunktionsunterschiede aufweisen, die sie für die Zwecke einer Google-Suche nicht unterscheiden.Wie bewerten "Wer ist zuerst?" als gleich "wer zuerst ist". in JavaScript?

Zum Beispiel würden diese Paare gleich betrachtet werden (zusammen mit anderen kleineren grammatische/Rechtschreibfehler Sie denken, können in Google könnte funktionieren):

Who's on first? 
whos on first. 

Where's the beef/problem? 
wheres the beef problem 

Gibt es eine Bibliothek Funktion in JavaScript, die dies tun würde ?

+1

Sie können die Interpunktionszeichen aus beiden Zeichenfolgen vor dem Vergleichen einfach entfernen. –

Antwort

1

Dies ist ein wirklich naive Art und Weise, da es offensichtlich nicht eine ganze Reihe von Themen wie Fehlbuchstabierungen umgehen kann:

var a = "some text totest....ok"; 
var b = "sometext totest ok"; 

function testRoughEquality(a, b) { 
    var ax = a.replace(/[^a-z]/gi, ""); 
    var bx = b.replace(/[^a-z]/gi, ""); 

    if(ax === bx) 
    { 
    alert('These strings were roughly the same: "' + a + '" and "' + b + '"'); 
    } 
    return true; 
}; 
+3

Obwohl das natürlich gleich ist "Ich half meinem Onkel Jack von seinem Pferd" und "Ich half meinem Onkel sein Pferd abzuheben" :) – Phrogz

+0

@Phrogz ja ja! Ich wette, heuristische Ansätze würden das auch falsch verstehen, aber ich habe noch nie Sprachanalysatoren geschrieben. –

3

Dies ist eigentlich keine einfache Aufgabe, um es richtig zu machen, müssen Sie nachschlagen stemming.

0

Die einfachste Antwort besteht darin, Zeichen zu entfernen, die keine Rolle spielen (die Apostrophe und Interpunktion in Ihrem Beispiel), andere Zeichen zu Worttrennzeichen zu normalisieren (der Schrägstrich in Ihrem Beispiel) und das Los zu verkleinern.

var strs = ["Who's on first?","whos on first."]; 
for (var i=0,len=strs.length;i<len;++i){ 
    strs[i] = strs[i].replace(/['?.]/g,'').replace(/[\/]/g,' ').toLowerCase(); 
} 
console.log(strs[0] == strs[1]); 
// true 
0

Wenn es nur die Interpunktion und Groß Ausgabe (wie die Beispiele oben), eine einfache Lösung, die sowohl durch einen regulären Ausdruck würde passieren bestimmte Interpunktionszeichen zu entfernen, dann Bekehrtfall zu senken und zu vergleichen.

Etwas wie:

function stringCompare(str1, str2) 
{ 
    var test = /[\?\'\/]/g; 
    var s1 = str1.replace(test,"").toLowerCase(); 
    var s2 = str2.replace(test,"").toLowerCase(); 
    if(str1 === str2) { return true; } 
    return false; 
} 
0
"who's on First?".replace(/[\?' ]/g,'').toLowerCase() 

Ruft Sie näher, aber Es ist nicht der beste Weg, es zu tun.

+0

Ich mag Jonathons Antwort besser. Berücksichtigt jedoch nicht den Fall. Sie möchten immer noch .toLowerCase() verwenden – Tavis