2009-12-15 39 views
5

Kann mir jemand mit einem regulären Javascript-Ausdruck helfen, den ich verwenden kann, um Zeichenketten zu vergleichen, die gleich sind und ihre Nicht-Umlaut-Ed-Versionen berücksichtigen.Regex zum Vergleichen von Strings mit Umlaut- und Nicht-Umlaut-Varianten

zum Beispiel, in Deutsch das Wort Grüße kann auch Gruesse geschrieben werden. Diese beiden Strings sind als identisch zu betrachten. Die Zuordnungen (Gehäuse für den Moment ignoriert) sind:

  • ä = ae
  • ü = ue
  • ö = oe
  • ß = ss

Da es nicht viele " Ich denke, ich könnte einen Ersatz für jede Variation machen, aber ich frage mich, ob es einen eleganteren Weg gibt, zumal dieser Anwendungsfall in Zukunft möglicherweise erweitert werden müsste, um z Scandanavian Zeichen ...

Antwort

14

so etwas wie

tr = {"ä":"ae", "ü":"ue", "ö":"oe", "ß":"ss" } 

replaceUmlauts = function(s) { 
    return s.replace(/[äöüß]/g, function($0) { return tr[$0] }) 
} 

compare = function(a, b) { 
    return replaceUmlauts(a) == replaceUmlauts(b) 
} 

alert(compare("grüße", "gruesse")) 

Sie können dies leicht verlängert sich um weitere Einträge hinzugefügt werden zu "tr"

nicht sehr elegant, sondern arbeitet

+0

das sieht sehr praktisch aus - ich werde es versuchen. Vielen Dank! – davek

+0

perfekt - es funktioniert und ich würde auch sagen, es ist elegant! – davek

1

Regex ist nicht bessere Technologie, um dieses Problem zu lösen.

Sie sollten überlegen, ein Wörterbuch zu erstellen, um Ihr Umlaut-Zeichen als Schlüssel und Nicht-Umlaut als Wert zu speichern; Dann können Sie über Ihr Wörterbuch iterieren, prüfen, ob es in Ihrer Zeichenkette vorhanden ist und entsprechende Maßnahmen ergreifen.

1

Sie können die Pipe als eine oder in einer Gruppe für jede Übereinstimmung verwenden, wie diese (ä|ae).

1

Eine Möglichkeit besteht darin, Ihren regulären Ausdruck 'input' so zu verarbeiten, dass er beispielsweise 'ä' durch (ae | ä) ersetzt '- nicht die Zuordnungen zu Ihren regulären Ausdrücken fest codieren. Ich bin völlig ignorant zu Javascript (ok, ich weiß document.write(), aber das ist es) - aber hier ist das gleiche in Pseudo-Code;

statt

regexp_match("Grüße|Gruesse",somestring) 

tun Sie sollten wie etwas tun:

mappings = (("ä","ae"),("ö","oe"),("ü","ue")) 
def my_regexp_match(regexp,input) { 
    for key,value in mappings { 
     new_regexp = regexp.replace(key,"("+key+"|"+value+")") 
    } 
    regexp_match(new_regexp,input) 
} 
my_regexp_match("Grüße",somestring) 

Leider, weil sie so "pythonic" - ich weiß nicht, ob Sie re.compile haben() -ähnlichen Struktur in Javascript, aber wenn Sie tun - Sie sollten die für -loop beim Kompilieren der Matcher, nicht in my_regexp_match()

+0

Zahnspange sind pythonic? : P Benutze zumindest nicht-einfangende Gruppen, aber das scheitert immer noch bei Zeichenklassen ('[äö]'). –

4

tun Reguläre Ausdrücke sind nicht ganz mächtig genug, um dies richtig zu tun, obwohl Sie es hacken könnten, fast mit ihnen zu arbeiten.

Was Sie wollen, heißt Unicode Normalization. Eine normalisierte Zeichenfolge wird in eine allgemeine Form konvertiert, sodass Sie sie vergleichen können. Sie haben Ihren Post "Javascript" markiert, Javascript hat jedoch keine eingebaute Standard-Bibliothek, um dies zu tun, und ich bin mir nicht bewusst, eines davon. Die meisten serverseitigen Sprachen haben jedoch eine. Zum Beispiel die Normalizer Class in PHP. Python und Perl haben Äquivalente, und ich bin mir sicher, dass es auch Microsoft-Sachen gibt.

Weitere Informationen finden Sie in der Wikipedia-Artikel auf Unicode Equivalence.

+0

das sind hilfreiche Links - danke. – davek

5

Neben stereofrogs answer:

tr = {"\u00e4":"ae", "\u00fc":"ue", "\u00f6":"oe", "\u00df":"ss" } 

ersetzeUmlauts = function(s) { 
    return s.replace(/[\u00e4|\u00fc|\u00f6|\u00df]/g, function($0) { return tr[$0] }) 
} 

Ich habe mich mit Umlauten in einem Aptana/Eclipse-Skript beschäftigt d Die normalen Charaktere ('ä' usw.) haben mir nicht geholfen.

+0

Vielen Dank für die Auflistung dieser \ Codes ... Ich war verrückt, warum Javascript Standard "ß" nicht ersetzen würde ... nur nicht erkannt. – Matt

3

Ich habe eine andere Art und Weise: (Zweck: Sortier Arrays)

function umlaut(str) { 
return str 
    .replace(/Â|À|Å|Ã/g, "A") 
    .replace(/â|à|å|ã/g, "a") 
    .replace(/Ä/g, "AE") 
    .replace(/ä/g, "ae") 
    .replace(/Ç/g, "C") 
    .replace(/ç/g, "c") 
    .replace(/É|Ê|È|Ë/g, "E") 
    .replace(/é|ê|è|ë/g, "e") 
    .replace(/Ó|Ô|Ò|Õ|Ø/g, "O") 
    .replace(/ó|ô|ò|õ/g, "o") 
    .replace(/Ö/g, "OE") 
    .replace(/ö/g, "oe") 
    .replace(/Š/g, "S") 
    .replace(/š/g, "s") 
    .replace(/ß/g, "ss") 
    .replace(/Ú|Û|Ù/g, "U") 
    .replace(/ú|û|ù/g, "u") 
    .replace(/Ü/g, "UE") 
    .replace(/ü/g, "ue") 
    .replace(/Ý|Ÿ/g, "Y") 
    .replace(/ý|ÿ/g, "y") 
    .replace(/Ž/g, "Z") 
    .replace(/ž/, "z"); 
} 
+2

Sie vermissten á in Zeile 4. –

+0

auch đćč usw. für kroatisch – Silve2611