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的顺序相反,则会出现无效范围错误。如果需要使用文字-
,请将其放在括号表达式的末尾。