【问题标题】:When does locale affect R's regular expressions?语言环境何时影响 R 的正则表达式?
【发布时间】:2013-11-04 10:18:19
【问题描述】:

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,看来locale在这里不是问题。

您能找到一个区域设置导致 [a-z] 等传统正则表达式类失败的示例吗?

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

【问题讨论】:

    标签: regex r locale


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2012-05-10
      • 2012-04-23
      • 1970-01-01
      • 2011-02-27
      • 1970-01-01
      • 1970-01-01
      • 2013-11-18
      • 1970-01-01
      • 2018-01-21
      相关资源
      最近更新 更多