首页 > 解决方案 > 使用双方括号的输出问题

问题描述

有人告诉我这[[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")

此外,我知道我们需要使用双方括号,比如"[[:digit:]]",因为"[:digit:]"宁愿搜索“:”、“d”、“i”、“g”或“t”(来自这个问题)。"[[:digit:]]"但是被解释的结构究竟是怎样的呢?(只是一个猜测:R 是否将其解释为[:digit:]与自身的微不足道的联合,以便它只是[:digit:]R 的“可读”?)

标签: rregex

解决方案


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

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

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

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

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

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

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

更多需要考虑的事情


推荐阅读