[:alpha:]类和[a-zA-Z]之间的区别是什么? [:alpha:]是否与操作系统无关?

5

我一直听说 [:alpha:] 字符类等同于 [A-Za-z],但从下面的输出结果来看,无论我是使用 gsub(带或不带 perl = TRUE)还是 stringi,这似乎并不是真的。似乎 [:alpha:] 匹配非 ASCII 字符,但我可能误解了。通过使用 ?regex 告诉我:

某些命名字符类是预定义的。它们的解释取决于语言环境(请参阅 locales),下面的解释是 POSIX 语言环境的解释。

但我仍然不理解其中的区别。对我来说,[A-Za-z] 精确地匹配 52 个字符,而 [:alpha:] 匹配更多。

问题

  1. [:alpha:] 类与 [a-zA-Z] 之间有什么区别?
  2. [:alpha:] 究竟会匹配什么?
  3. [:alpha:] 在不同操作系统和世界各地的位置上是否都能正常工作?
x <- c(
    "danish characteøs  sentåment æcores words correctly 456",
    "It works with probleme but not with problème 234"
)

gsub("[[:alpha:] ]",  '', x)
## "456" "234"

gsub("[a-zA-Z ]",  '', x)
## [1] "øåæ456" "è234"

stringi::stri_replace_all_regex(x, "[[:alpha:] ]",  '')
## "456" "234"

stringi::stri_replace_all_regex(x, "[a-zA-Z ]",  '')
## [1] "øåæ456" "è234"

2
A-Z 包括 A 到 Z 之间的字母,这是英文字母表中的每个字母,上面的示例使用了扩展字符集。è 在哪里?不在 a-z 之间,因此需要使用 alpha。 - Dave2e
在与POSIX结合紧密阅读时,perllocale进入了野外,展示了测试和变数。 - Chris
1个回答

7
  1. [:alpha:] 代表"字母字符:",与 [:digit:] 相对应。它包括您字符编码中的每个字母字符。而 [a-zA-Z] 则捕获在符号 'a' 和 'z' 之间的任何字符以及 'A' 和 'Z'。正如 @Charles Duffy 指出的那样,这些字符的区域顺序可能不同,因此其他字符可能会被包含在内。但是,在标准英语 UTF-8 中,这将仅包括标准英语字母(26 个字母*2个小写和大写=52),因此不包括其他语言的任何字母,例如 é、ö、ï 等。

  2. [:alpha:] 将匹配所有字母字符。

  3. 是的,由于 [:alpha:] 匹配所有字母字符,它在不同语言、操作系统或位置上都能够正常工作。

更多背景信息,R 中实现的 regex 函数(由greplregexprgregexprsubgsub等函数使用)遵循 POSIX 1003.2 标准。这意味着匹配基于:

字符的编码位模式,而不是字符的图形表示。

以下是 "en_GB.UTF-8" 的 Sys.getlocale(category = "LC_ALL") 变量示例的不同语言字符变化:

fr_chr <- "Voix ambiguë d’un cœur qui au zéphyr préfère les jattes de kiwi."
ge_chr <- "Fix, Schwyz! quäkt Jürgen blöd vom Paß."
gr_chr <- "Ταχίστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός."
en_chr <- "Shaw, those twelve beige hooks are joined if I patch a young, gooey mouth."
cn_chr <- "敏捷的棕色狐狸跨过懒狗"

gsub("[[:alpha:]]","",fr_chr)
[1] "  ’         ."
gsub("[[:alpha:]]","",ge_chr)
[1] ", !     ."
gsub("[[:alpha:]]","",gr_chr)
[1] "    ,    ."
gsub("[[:alpha:]]","",en_chr)
[1] ",           ,  ."
gsub("[[:alpha:]]","",cn_chr)
[1] ""

gsub("[A-Za-z]","",fr_chr)
[1] " ë ’ œ   é éè    ."
gsub("[A-Za-z]","",ge_chr)
[1] ", ! ä ü ö  ß."
gsub("[A-Za-z]","",gr_chr)
[1] "Ταχίστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός."
gsub("[A-Za-z]","",en_chr)
[1] ",           ,  ."
gsub("[A-Za-z]","",cn_chr)
[1] "敏捷的棕色狐狸跨过懒狗"

4
根据本地排序规则,[a-z] 可能包含其他字符。不过这并不是可以打赌的事情,它是否包含其他字符是不确定的。 - Charles Duffy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接