4

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

来自?regex

'[[:alnum:]]' 表示'[0-9A-Za-z]',除了后者取决于语言环境和字符编码,而前者独立于语言环境和字符集。

我想知道什么时候会出现特定于语言环境的问题。

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

在爱沙尼亚语中,“Z”介于“S”和“T”之间</p>

在丹麦语中,'aa' 排序为单个字母,在 'z' 之后</p>

在第一个示例中,我希望 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")  

由于所有值都 return TRUE,因此 locale 似乎在这里不是问题。

你能找到一个语言环境导致传统正则表达式类[a-z]失败的例子吗?

更新:我有一个部分答案:重音罗马字符在使用[a-zA-Z]vs.时表现不同[[:alpha:]]。我仍然很想知道是否有更多的差异示例,以及语言环境或编码是否会影响非罗马字符的匹配,实际上,你如何匹配非罗马字符。

4

1 回答 1

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
于 2013-11-04T11:26:01.770 回答