R 使用双方括号输出的问题

R 使用双方括号输出的问题,r,regex,R,Regex,我被告知[[a-z][0-9]]等同于[a-z0-9],但我尝试了几个例子: grepl(“[[a-z][0-9]]”,“d”)返回FALSE 类似地,grepl(“[:alpha:[0-9]]”,“d”)返回FALSE,而像grepl(“[:上:[:下:][]”,“d”)这样的操作很好 请问这是否表明双方括号只能用于组合形式为“[:…:]”的事物,而不能用于[A-z]或[0-9]的事物 如果是这样,为什么R会阻止我们这样做?那么grepl([[a-z][0-9]],“d”)和grepl([[a

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

grepl(“[[a-z][0-9]]”,“d”)
返回
FALSE

类似地,
grepl(“[:alpha:[0-9]]”,“d”)
返回
FALSE
,而像
grepl(“[:上:[:下:][]”,“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://code>与自身的简单结合,因此它只是R的一个“可读的”
[:digit://code>)

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

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

  • [
    ]
    标记的开始和结束,例如
    [:alpha:][/code>
  • [
    ]
    标记一个项目的开始和结束
  • 未替换的
    ]
    前面没有匹配的未替换的open
    [
    被视为文本
    ]
    字符
[[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 regex中的
    d
    i
    g
    t
    ,但ICU regex库(用于stringr/stringi regex函数)支持这些裸POSIX字符类(如中所述),并匹配一个数字,甚至在括号表达式之外

感谢您的帮助性澄清!我现在理解了其中的大部分。我想进一步问一下,R如何知道字符类中的
[
是文字字符还是POSIX字符类的开头?(正如您所说的“在字符类中,[可以在任何地方使用]来匹配[char”)这是因为R检测到POSIX字符类的
之后的
[
吗?@J-A-S正则表达式从左到右进行解析,一旦正则表达式引擎进入括号表达式,它就确切地知道它可以在括号表达式内匹配什么。因此,如果
[
在那里匹配,检查下一个字符,并且因为它是
,所以检查下一个字符,以此类推,直到
:]
,然后根据有效的POSIX字符类名检查找到的名称,然后继续…所以,要小心:
[:]
将失败,出现
未知字符类名
错误,请确保括号表达式中没有“悬空”
[:
[:[]
将起作用。在更智能的PCRE正则表达式中,您可以使用
[:]
。谢谢:)这很有道理。顺便说一句,谢谢你在最后一节中提供了两个额外的信息嗨,很抱歉再次打扰你,我可以问一下为什么
'[]-/]'
'[]-/]'
'[]-/'
是无效的字符范围,而
'[]/-]'
'[]/-]“
不是吗?@J-A-S通常,请参见和,请记住,
-
在Unicode表中的两个字符之间创建一个范围,这两个字符必须符合规则:第一个字符必须在表中具有较低的ID,第二个字符(范围上限)必须具有更高的ID。如果ID的顺序相反,则会出现无效范围错误。如果需要使用文字
-
,请将其放在括号表达式的末尾。