正则表达式将字符串与变音符号和非变音符号变体进行比较

时间:2009-12-15 19:34:43

标签: javascript regex

任何人都可以帮助我使用javascript正则表达式,我可以用它来比较相同的字符串,考虑到它们的非Umlaut-ed版本。

例如,在德语中,Grüße一词也可以写成Gruesse。这两个字符串被认为是相同的。映射(暂时忽略外壳)是:

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

由于没有太多的“对联”可以考虑我可以替换每个变体,但我想知道是否有更优雅的方式,特别是因为这个用例可能需要在将来扩展以包括例如斯堪的纳维亚人物......

7 个答案:

答案 0 :(得分: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”

添加更多条目来轻松扩展此功能

不太优雅,但有效

答案 1 :(得分: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脚本处理变形金刚,而正常的角色('ä'等)并没有为我做这个伎俩。

答案 2 :(得分:5)

我有另一种方式:(目的:排序数组)

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

答案 3 :(得分:4)

正则表达式相当非常强大,无法正确执行此操作,但您可以将其破解为几乎与它们一起使用。

您想要的是 Unicode规范化。规范化字符串是转换为通用表单的字符串,因此您可以比较它们。你标记了你的帖子“javascript”,但是,Javascript没有内置的标准库来执行此操作,我不知道有一个随意。 但是,大多数服务器端语言都有一个。例如,PHP中的Normalizer Class。 Python和Perl具有等价物,微软的东西也是如此,我敢肯定。

查看Unicode Equivalence上的维基百科文章,了解更多信息。

答案 4 :(得分:1)

Regex并不是解决此问题的更好技术。

您应该考虑创建一个字典,将您的变音符号作为键和非变音符号存储为值;然后你可以迭代你的字典,检查你的字符串是否存在并采取适当的行动。

答案 5 :(得分:1)

您可以将管道用作每个匹配的组或组,如(ä|ae)

答案 6 :(得分: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)

很抱歉这样“pythonic” - 我不知道你是否在javascript中有re.compile()类似的结构,但如果你这样做 - 你应该在编译匹配器时执行for -loop,而不是在my_regexp_match中( )