R正则表达式中的变音符号匹配

时间:2015-11-06 07:56:50

标签: regex r macos diacritics

我只是痛苦地使用R(在OS X上)。

我有一套德语命名文件。并且有我做这个例子的奇怪行为(第一个'Käse'是从键盘输入的 - 第二个是从ls.files()输出复制的):

names <- c('Käse', 'Käse')
grepl('Käse', names)

# [1] TRUE FALSE

经过大量的大脑抨击后,我在控制台中注意到,变形金刚的显示略有不同。

最后我发现:

iconv(names,'latin1','ascii','bytes')

# [1] "K<c3><a4>se"  "Ka<cc><88>se"

这尤其令人惊讶,因为字母ä是代码为132的ASCII字符的一部分。

当我输入(从键盘输入)

时,我也注意到了
system('touch käse2')

它会自动转换为第二种编码。

所以我的问题是 - 如何配置R我在正则表达式中键入的变音符号将与文件名中使用的变音符号相匹配?

Sys.getlocale的输出:

> Sys.getlocale()
[1] "de_AT.UTF-8/de_AT.UTF-8/de_AT.UTF-8/C/de_AT.UTF-8/de_AT.UTF-8"

更新

困扰我的行为如下:

filename <- 'Käse.Rdata'
save(file=filename)
list.files(pattern=filename)
# character(0)

因此文件名不等于用于创建它的字符串。

嗯 - 这似乎是Mac特有的 - 在我的Windows机器上它按预期工作。

1 个答案:

答案 0 :(得分:3)

"K<c3><a4>se"将“ä”编码为unicode字符U + 00E4(LATIN SMALL LETTER A WITH DIAERESIS)。

"Ka<cc><88>se"将“ä”编码为unicode字符U + 0061(LATIN SMALL LETTER A)和U + 0308(COMBINING DIAERESIS)。

两者在技术上都是正确的,但却截然不同。要比较它们,您需要规范化字符串。您可以使用包stringi

stri_trans_nfc("Ka\u0308se") -> "K\u00E4se"

更多信息: