有人告诉我[[a-z][0-9]]
等同于[a-z0-9]
,但我尝试了几个例子:
grepl("[[a-z][0-9]]", "d")
返回FALSE
.
同样,grepl("[[:alpha:][0-9]]", "d")
返回FALSE
而grepl("[[: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 正则表达式中的:
、d
、i
、g
或t
,但 ICU 正则表达式库(用于字符串/字符串正则表达式函数)支持这些裸 POSIX 字符类(如POSIX 字符类中所述,在基本 R 正则表达式中不起作用),并且甚至在括号表达式之外也匹配数字[A-z]
匹配的不仅仅是字母。