2009-12-15 56 views
5

任何人都可以幫助我一個JavaScript正則表達式,我可以用它來比較字符串是相同的,考慮到他們的非變音編輯版本。正則表達式來比較字符串與元音變音和非變音變奏

例如,在德語中,詞Grüße也可以寫成Gruesse。這兩個字符串被認爲是相同的。的映射(暫時忽略腸衣)是:

  • ä= AE
  • U = UE
  • ö= OE
  • SS = SS

由於不會有太多的「對聯「來考慮我可以替換每個變體,但我想知道是否有更優雅的方式,特別是因爲這個用例可能需要在未來擴展以包含例如斯堪的納維亞字符...

回答

14

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

,你可以很容易地通過添加更多的項目擴展了此爲 「TR」

不太優雅,但工程

+0

看起來非常方便 - 我會試一試。謝謝! – davek 2009-12-15 20:29:55

+0

完美 - 它的作品,我也會說它很優雅! – davek 2009-12-16 07:44:06

1

Regex是不是更好的技術來解決這個問題。

您應該考慮創建一個字典,以將變音符字符存儲爲鍵值和非變音符號值;然後你可以迭代你的字典,檢查它是否存在於你的字符串上並採取適當的行動。

1

您可以使用管道作爲或組中的每個匹配項,如(ä|ae)

1

一種方法是處理您的正則表達式「輸入」,以便用(ae |ä)替代例如'ä' - 不會硬編碼映射到您的正則表達式。我完全不知道JavaScript(好吧,我知道document.write(),但這是關於它) - 但這裏是相同的僞代碼;的

,而不是做

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

你應該這樣做:

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) 

對不起這麼 「Python化」 - 我不知道你是否有re.compile()樣結構在JavaScript中,但如果這樣做 - 你應該-loop編譯匹配的時候,而不是在my_regexp_match()做

+0

花括號是Python的? :P至少使用非捕獲組,但字符類仍然失敗('[äö]')。 – 2009-12-15 20:07:55

4

正則表達式是不是相當強大到足以做到這一點,雖然你可以入侵幾乎與他們合作。

你想要什麼叫做Unicode規範化。標準化字符串是一種轉換爲常用表格的格式,因此您可以將它們進行比較。您將自己的帖子標記爲「javascript」,但是,Javascript沒有內置標準庫來執行此操作,並且我不知道其中的一個。儘管如此,大多數服務器端語言都有一個。例如,PHP中的Normalizer Class。 Python和Perl有等價物,我相信微軟的東西也是如此。

查閱關於Unicode Equivalence的維基百科文章瞭解更多信息。

+0

這些是有用的鏈接 - 謝謝。 – davek 2009-12-15 20:30:55

5

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

我正在處理Aptana/Eclipse腳本中的變音符號ð正常字符('ä'等)沒有爲我做詭計。

+0

非常感謝你列出這些\代碼......我爲什麼Javascript不會取代標準的「​​ß」......只是不認識它。 – Matt 2014-04-15 17:05:15

3

我有另一種方式:(目的:數組排序)

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

您錯過了第4行á – 2013-05-03 13:00:52

+0

也đćč等克羅地亞 – Silve2611 2016-04-26 17:41:19