2009-12-15 13 views
5

Qualcuno può aiutarmi con un'espressione regolare javascript che posso utilizzare per confrontare stringhe uguali, prendendo in considerazione le loro versioni non Umlaut-ed.Regex per confrontare le stringhe con le variazioni di Umlaut e non Umlaut

ad esempio, in tedesco è possibile scrivere anche la parola GrüßeGruesse. Queste due stringhe devono essere considerate identiche. Le mappature (ignorando involucri per il momento) sono:

  • ä = ae
  • ü = ue
  • ö = OE
  • ß = SS

Poiché non ci sono molti " distici "per considerare che potrei fare un rimpiazzo per ogni variazione, ma mi chiedo se c'è un modo più elegante, specialmente perché questo caso potrebbe dover essere esteso in futuro per includere ad esempio Personaggi scandanaviani ...

risposta

14

qualcosa come

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

si può facilmente estende questo aggiungendo più voci di "tr"

non molto elegante, ma funziona

+0

che sembra molto utile - ci provo. Grazie! – davek

+0

perfetto - funziona e direi anche che è elegante! – davek

1

Regex non è la tecnologia migliore per risolvere questo problema.

Si dovrebbe prendere in considerazione la creazione di un dizionario per memorizzare il proprio carattere Umlaut come chiave e non-Umlaut come valore; Quindi è possibile eseguire un'iterazione sul proprio codice, verificare se esiste sulla stringa e adottare le misure appropriate.

1

È possibile utilizzare la conduttura come gruppo o in un gruppo per ogni abbinamento come questo (ä|ae).

1

Un modo è elaborare l''espressione' di regexp in modo che sostituisca ad esempio 'ä' con (ae | ä) '- non codifica in hardcode le mappature alle tue espressioni regolari. Sono completamente all'oscuro di javascript (ok, conosco document.write() ma questo è tutto) - ma qui è lo stesso in pseudo codice;

invece di fare

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

Si dovrebbe fare qualcosa di simile:

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) 

Siamo spiacenti per essere così "divinatorio" - Non so se avete re.compile() -come struttura in javascript, ma se lo fai - dovresti fare il for -loop quando compili il matcher, non in my_regexp_match()

+0

parentesi graffe sono divinatorio? : P Almeno usi gruppi non catturanti, ma questo non funziona ancora per le classi di caratteri ('[äö]'). –

4

Le espressioni regolari non sono piuttosto abbastanza potente da farlo correttamente, anche se potreste inciderlo in quasi lavorare con loro.

Quello che si desidera è chiamato Normalizzazione Unicode. Una stringa normalizzata è una stringa convertita in un modulo comune per poterle confrontare. Hai taggato il tuo post "javascript", tuttavia Javascript non ha una libreria standard incorporata per farlo e non ne sono a conoscenza. Tuttavia, la maggior parte delle lingue sul lato server ne ha uno. Ad esempio, lo Normalizer Class in PHP. Python e Perl hanno equivalenti, così come le cose di Microsoft, ne sono sicuro.

Per ulteriori informazioni, consultare l'articolo di Wikipedia su Unicode Equivalence.

+0

quelli sono collegamenti utili - grazie. – davek

5

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

Avevo a che fare con Umlauts in uno script Aptana/Eclipse e d i personaggi normali ('ä' ecc.) non hanno fatto il trucco per me.

+0

Grazie mille per aver elencato quei \ codici ... stavo impazzendo sul perché Javascript non sostituisse lo standard "ß" ... semplicemente non lo riconoscevo. – Matt

3

Ho un altro modo: (Finalità: l'ordinamento array)

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

Hai perso á nella riga 4. –

+0

anche đćč ecc per croato – Silve2611

Problemi correlati