考虑:
$ echo '<H1>heading</H1>' | grep '<H\(1\|3\|2\)>.*</H\1>'
$ <H1>heading</H1>
和
$ echo '<H1>heading</H3>' | grep '<H[1-3]>.*</H\1>'
$ grep: Invalid back reference
第一个命令工作得很好。
[1-3]
和\(1\|3\|2\)
不是都意味着 1 或 2 或 3吗?如果不是为什么?它们之间有什么区别?- 为什么反向引用仅适用于
\(\)
?
答案1
关于第 1 部分:是的,两种模式都会匹配 1 或 2 或 3。
第一个问题的部分答案是你的第二个问题。有趣的是。
括号用于启用反向引用,并阐明运算符优先级/分组。
方括号括起来字符类。它们用于匹配一里面的字符集实例。
例如,\(hello\)
将匹配单词“hello”,并将其放入适当的反向引用变量(\1
、\2
等)
另一方面,[hello]
将匹配单个字符,即集合 {e,h,l,o} 中的一个。
一些附加数据(只是附加信息):
反向引用基于左括号的顺序,而不是右括号的顺序。对于嵌套括号,这可能变得很重要。为了可读性而忽略转义字符——(this (that) (the other))
将导致\1
包含this that the other
;\2
包含that
和\3
包含the other
。
对字符类的计数会检查该字符类的更多实例。它们不必以相同的方式匹配。例如,[0-9]
将匹配单个数字,并将[0-9]{5}
匹配任何五个数字。如果您只想匹配 5 个重复数字,例如匹配 77777 或 33333 但不匹配 37497,请使用反向引用:\([0-9]\)\1{4}
答案2
()
意思是“分组”,意思是设置一部分细绳它可以作为 1 个项目运行,也可以用于反向引用。[]
方法符号放
因此,如果您仅对单个符号使用括号,则含义是相同的。但通常它用于多符号字符串,例如(cat|dog)