r语言 - 使用双方括号的输出有问题



有人告诉我[[a-z][0-9]]等同于[a-z0-9],但我尝试了几个例子:

grepl("[[a-z][0-9]]", "d")返回FALSE.

同样,grepl("[[:alpha:][0-9]]", "d")返回FALSEgrepl("[[:upper:][:lower:]]", "d")之类的东西工作正常。

请问这是否表明双方括号只能用于组合"[:...:]"形式的事物,而不能用于[A-z][0-9]之类的东西?

如果是这样,为什么R会阻止我们这样做?grepl("[[a-z][0-9]]", "d")grepl("[[a-z]]", "d")到底是什么意思?

对于 Thermore,我知道我们需要使用双方括号,例如,对于像"[[:digit:]]"这样的东西,因为"[:digit:]"宁愿搜索":"、"d"、"i"、"g"或"t"(来自这个问题)。但是,究竟如何解释"[[:digit:]]"的结构呢?(只是一个猜测:R是否将其解释为[:digit:]与自身的平凡联合,以便它只是R的"可读"[:digit:]

您应该小心正则表达式中的方括号。现在,我假设您使用的是与基本 R 正则表达式函数一起使用的默认 TRE 正则表达式库(当未传递perl=TRUE时)。

在这种情况下,您应该区分

  • 标记 POSIX 字符类开始和结束的[],例如[:alpha:]
  • 标记括号表达式开头和结尾的[]
  • 前面没有匹配的未转义开放[的未转义]被视为文字]字符。

正则表达式[[a-z][0-9]]不等于[a-z0-9]

  • [[a-z][0-9]]匹配字符串,如[1]a1]和 表示:
    • [[a-z]- 与[字符或任何小写 ASCII 字母匹配的括号表达式
    • [0-9]- 一个数字
    • ]- 一个]字符。

[a-z0-9]括号表达式仅匹配小写 ASCII 字母或数字。

正则表达式中没有双方括号这样的结构。在字符类中,[可以在任何地方使用,以匹配[字符。]仅当]放在括号表达式的开头时,才匹配该:

  • [a-z[]匹配单个字符、小写 ASCII 字母或[
  • [][a-z]匹配单个字符、小写 ASCII 字母、[]
  • [[a-z]]匹配小写的 ASCII 字母或[,然后匹配]字符(因此总共 2 个字符)

更多需要考虑的事项

  • [:digit:]确实匹配 TRE 和 PCRE 正则表达式中的:digt,但 ICU 正则表达式库(用于字符串/字符串正则表达式函数)支持这些裸 POSIX 字符类(如POSIX 字符类中所述,在基本 R 正则表达式中不起作用),并且甚至在括号表达式之外也匹配数字
  • [A-z]匹配的不仅仅是字母。

最新更新