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:]]
的重音罗马字符表现不同。我仍然有兴趣知道是否有更多的差异示例,以及区域设置或编码是否会影响非罗马字符的匹配,实际上,您是如何匹配非罗马字符的。
答案 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