Javascript Regex将字符串与Umlaut和非Umlaut变体进行比较

Javascript Regex将字符串与Umlaut和非Umlaut变体进行比较,javascript,regex,Javascript,Regex,有人能帮我介绍一个javascript正则表达式吗?我可以用它来比较相同的字符串,并计算它们的非Umlaut版本 例如,在德语中,Grüße一词也可以写成Gruesse。这两个字符串应视为相同。映射(暂时忽略外壳)为: ä=ae ü=ue ö=oe ß=ss P>因为没有太多的“对联”要考虑,我可以对每一个变体做一个替换,但是我想知道是否有一个更优雅的方式,特别是因为这个用例可能需要在未来扩展到包括斯堪的纳维亚字符…… < P> ReXEX 不是解决这个问题的更好的技术。 你应该考虑创建

有人能帮我介绍一个javascript正则表达式吗?我可以用它来比较相同的字符串,并计算它们的非Umlaut版本

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

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

<> P>因为没有太多的“对联”要考虑,我可以对每一个变体做一个替换,但是我想知道是否有一个更优雅的方式,特别是因为这个用例可能需要在未来扩展到包括斯堪的纳维亚字符……

< P> <代码> ReXEX <代码>不是解决这个问题的更好的技术。

你应该考虑创建一个字典来存储你的UMLUUT字符作为关键字和非UMLUUT作为值;然后你可以迭代字典,检查你的字符串上是否有它,并采取适当的行动。

你可以使用管道作为一个或在一个组中进行这样的匹配
(|ae)

一种方法是处理你的regexp'input',这样它就可以用(ae|||)代替例如'a'——而不是硬编码到你的regexp的映射。我对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()的结构,但如果有-在编译matcher时应该执行for循环,而不是在my_regexp_match()中。

正则表达式的功能还不够强大,无法正确执行此操作,尽管您可以将其修改为几乎可以使用它们

您需要的是Unicode规范化。规范化字符串是转换为通用形式的字符串,以便您可以对其进行比较。您将您的帖子标记为“javascript”,但是,javascript没有内置的标准库来完成此操作,我现在还不知道有这样一个库。 不过,大多数服务器端语言都有一个。例如,PHP中的。我敢肯定,Python和Perl是等价的,微软的东西也是如此

有关更多信息,请查看上的维基百科文章。

类似

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”中添加更多条目来轻松扩展此功能

不太优雅,但除了:


我用Aptana/Eclipse脚本处理Umlauts,而普通字符(ä等)并没有帮我解决问题。

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


牙套是肾盂的吗P至少使用非捕获组,但对于角色类(
[äö]
)仍然失败。这看起来非常方便-我将尝试一下。非常感谢。非常感谢您列出这些\代码。。。对于Javascript为什么不能取代标准的“ß”,我简直是疯了。。。只是不认识而已。还有克罗地亚人的đćč等
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] })
}
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"); 
}