locale何时会影响R的正则表达式?

时间:2013-11-04 10:18:19

标签: regex r locale

R有几个特殊的与语言环境无关的正则表达式字符类。

来自?regex

  

'[[:alnum:]]'的意思是'[0-9A-Za-z]',除了后者   取决于区域设置和字符编码,而   前者独立于语言环境和字符集。

我想知道何时可能出现特定于语言环境的问题。

我根据?Comparison帮助页面中的信息尝试了两个示例,其中描述了字符串的排序方式:

  爱沙尼亚语'Z'中的

介于'S'和'T'之间

  

在丹麦'aa'中作为单个字母,在'z'之后

在第一个例子中,我希望T,U,V,W,X和Y不匹配。在第二个例子中,我希望aa不匹配。

Sys.setlocale("LC_ALL", "Estonian")
grepl("[A-Z]", LETTERS)

Sys.setlocale("LC_ALL", "Danish")
grepl("[a-z]", "aa")  

由于所有值都返回TRUE,因此这里的区域设置似乎不是问题。

您能找到一个示例,其中语言环境会导致传统正则表达式类(如[a-z]失败吗?

更新:我有一个部分答案:使用[a-zA-Z][[:alpha:]]的重音罗马字符表现不同。我仍然有兴趣知道是否有更多的差异示例,以及区域设置或编码是否会影响非罗马字符的匹配,实际上,您是如何匹配非罗马字符的。

1 个答案:

答案 0 :(得分:1)

似乎重音罗马字符的行为存在差异。

grepl("[a-zA-Z]", c("å", "é"))
## [1] FALSE FALSE
grepl("[[:alpha:]]", c("å", "é"))
## [1]  TRUE  TRUE

奇怪的是,非罗马字符无法匹配任何一个字符类(至少在我尝试过的少数语言环境和编码中)。

mu <- "\U03BC"
ya <- "\U044F"
jeem <- "\U062C"
grepl("[a-zA-Z]+", c(mu, ya, jeem))
## [1] FALSE FALSE FALSE
grepl("[[:alpha:]]", c(mu, ya, jeem))
## [1] FALSE FALSE FALSE