基本正则表达式中[]和\(\)的区别

基本正则表达式中[]和\(\)的区别

考虑:

$ 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. [1-3]\(1\|3\|2\)不是都意味着 1 或 2 或 3吗?如果不是为什么?它们之间有什么区别?
  2. 为什么反向引用仅适用于\(\)

答案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)

相关内容