2009-12-15 55 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