Regex compare les chaînes avec les variations Umlaut et Non-Umlaut

Est-ce que quelqu'un peut m'aider avec une expression régulière javascript que je peux utiliser pour comparer les chaînes qui sont identiques, en tenant compte de leurs versions non-Umlaut-ed.

Par exemple, en allemand, le mot Grüße peut aussi être écrit Gruesse . Ces deux cordes doivent être considérées comme identiques. Les mappages (ignorant les enveloppes pour le moment) sont:

  • Ä = ae
  • Ü = ue
  • Ö = oe
  • ß = ss

Comme il n'y a pas beaucoup de «couplets» à considérer, je pourrais faire un remplacement pour chaque variation, mais je me demande s'il existe une manière plus élégante, d'autant plus que ce cas d'utilisation pourrait être étendu à l'avenir pour inclure par exemple des caractères scandinaves. ..

quelque chose comme

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

Vous pouvez facilement étendre cela en ajoutant plus d'entrées à "tr"

Pas assez élégant, mais fonctionne

En plus de la réponse de Stereofrogs :

 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] }) } 

Je m'occupais d'Umlauts dans un script Aptana / Eclipse et les personnages normaux ('ä' etc.) ne m'ont pas fait l'affaire.

Les expressions régulières ne sont pas assez puissantes pour le faire correctement, bien que vous puissiez la piéger pour presque travailler avec elles.

Ce que vous désirez s'appelle Normalization Unicode. Une chaîne normalisée est convertie en une forme commune afin de pouvoir les comparer. Vous avez marqué votre poste "javascript", cependant, Javascript n'a pas de bibliothèque standard intégrée pour le faire, et je ne suis pas au courant. Cependant, la plupart des langages côté serveur ont un. Par exemple, la classe Normalizer en PHP. Python et Perl ont des équivalents, tout comme Microsoft, je suis sûr.

Consultez l'article wikipedia sur Equivalence Unicode pour plus d'informations.

J'ai une autre façon: (but: classer les tableaux)

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

Vous pouvez utiliser le tuyau en tant que groupe ou en groupe pour chaque correspondance comme ceci (ä|ae) .

L'une des façons est de traiter votre «entrée» de regexp pour qu'il remplace par exemple 'ä' par (ae | ä) '- ne code pas les mappages dans vos regexps. Je suis complètement ignorant de javascript (ok, je sais document.write () mais c'est à propos) – mais voici le même dans pseudo-code;

Au lieu de faire

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

Vous devriez faire quelque chose comme:

 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) 

Désolé d'être tellement "pythonique" – Je ne sais pas si vous avez une structure similaire à re.compile () dans javascript, mais si vous le faites – vous devriez faire pour -loop lors de la compilation du matcher, pas dans my_regexp_match ()

Regex n'est pas une meilleure technologie pour résoudre ce problème.

Vous devriez envisager de créer un dictionnaire pour stocker votre caractère Umlaut comme clé et non-Umlaut comme valeur; Ensuite, vous pouvez faire itérer sur votre dictionnaire, vérifier s'il existe sur votre chaîne et prendre les mesures appropriées.