r - 使用双方括号的输出问题
问题描述
有人告诉我这[[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")
?
此外,我知道我们需要使用双方括号,比如"[[:digit:]]"
,因为"[:digit:]"
宁愿搜索“:”、“d”、“i”、“g”或“t”(来自这个问题)。"[[:digit:]]"
但是被解释的结构究竟是怎样的呢?(只是一个猜测:R 是否将其解释为[:digit:]
与自身的微不足道的联合,以便它只是[:digit:]
R 的“可读”?)
解决方案
您应该小心正则表达式中的方括号。现在,我假设您正在使用与基本 R 正则表达式函数一起使用的默认 TRE 正则表达式库(当没有perl=TRUE
传递时)。
在这种情况下,您应该区分
[
并]
标记POSIX 字符类的开始和结束,例如[:alpha:]
[
并]
标记括号表达式的开始和结束- 前面没有匹配的未转义
]
打开的未转义[
被视为文字]
字符。
正[[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 个字符)
更多需要考虑的事情
[:digit:]
确实匹配:
,d
,i
,g
ort
在 TRE 和 PCRE 正则表达式中,但是 ICU 正则表达式库(用于stringr / stringi正则表达式函数)支持这些裸 POSIX 字符类(如POSIX 字符类在 base R regex 中不起作用)并匹配一个数字甚至在括号表达式之外[A-z]
匹配的不仅仅是字母。
推荐阅读
- javascript - lit-element 不渲染用于复制/粘贴/打印的嵌套(子)组件
- bash - 输出流到输入
- ios - 如何为多个产品配置 xcode 项目?
- flutter - 在单击项目构建器 Flutter 的行视图时刷新 ListView.builder
- vue.js - 多参数 InertiaJS 路由
- r - 如何根据状态为图表着色
- terminal - tmux:如何判断窗格当前是否通过管道传输?
- swift - SwiftUI Preview 找不到使用过的框架的图像
- angular - 带有组和未分组项的 Angular ng-select 菜单
- github - 当我尝试在 git 中上传文件时