正则表达式陷阱Umlaute和结合diaeresis

时间:2017-01-15 13:17:18

标签: regex unicode diacritics capture-group diaeresis

我在通过正则表达式重命名文件时遇到了这个问题(使用Mp3tag)。

我知道问题是什么,并创建这篇文章以帮助其他人,寻找同样的问题。我也在寻找其他解决方法的建议。

以下是我遇到的问题:

我想替换文件名中的所有“Umlaute”。在这种情况下,它是“ä”。在“常规”“ä”无效后,我决定将文件名中的字母复制到我的正则表达式中。

问题

正则表达式:[ää][ä]

替换:ae

文件名:Hätte hätte Fahrradkette.avi

预期结果: Haette haette Fahrradkette.avi

结果我得到了: Haeaette haeaette Faehrraedkette.aevi

https://www.regex101.com/r/RZkHFG/1

原因

ä(U + 00E4)是单个unicode符号(“带分音符的拉丁文小写字母”)

-

看起来像一个unicode符号,即使在通过键盘/鼠标选择时也是如此。 但实际上有2个符号!

a(U + 0061)(“拉丁文小写字母a”)

̈(U + 0308)(“结合分音符”)

如果你知道这一点,正则表达式的“奇怪”行为就会变得非常清楚。捕获组由2个符号组成,它们将独立匹配。这就是为什么所有常规“a”也将被替换的原因。

解决方案

我当前的解决方法如下所示:([ä]|ä)(我保留捕获组,因为在某些情况下我有多个应该被替换的符号)

https://www.regex101.com/r/mzHsG2/1

有没有人有更好/更清洁的解决方案?

̈替换为“e”只适用于ä ö ü - > ae oe ue,但在̈与不同符号一起使用时,通常会将其替换为“e”可能会导致不必要的结果。

0 个答案:

没有答案