regex - R 正则表达式中的变音匹配

标签 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 机器上它按预期工作。

最佳答案

"K<c3><a4>se"将“ä”编码为 un​​icode 字符 U+00E4(带有分音符号的拉丁文小写字母 A)。

"Ka<cc><88>se"将“ä”编码为 un​​icode 字符 U+0061(拉丁文小写字母 A)和 U+0308(组合分音符)。

两者在技术上都是正确的,但又截然不同。要比较它们,您需要对字符串进行标准化。您可以使用包 stringi :

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

更多信息:

关于regex - R 正则表达式中的变音匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33561962/

相关文章:

arrays - 数组操作给我合并表

r - 如何恢复保存到磁盘列表中的 ggplot?

r - 如何使用ggvis将多个图形放在一个图中

macos - 我必须指定哪些权利才能在 NSTask() 中使用默认写入 com.apple.screencapture

python - 子列表的正则表达式

java - @QueryParam 正则表达式

arrays - 数组的最后一个元素匹配 scala

javascript - 正则表达式

c++ - asin 使用 Clang 在不同的平台上产生不同的答案

c++ - 如何从 Qt Creator 项目中调用 Carbon 函数?