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

Edw*_*lds 4 grep regular-expression

考虑:

$ echo '<H1>heading</H1>' | grep '<H\(1\|3\|2\)>.*</H\1>'
$ <H1>heading</H1>
Run Code Online (Sandbox Code Playgroud)

$ echo '<H1>heading</H3>' | grep '<H[1-3]>.*</H\1>'
$ grep: Invalid back reference
Run Code Online (Sandbox Code Playgroud)

第一个命令工作得很好。

  1. [1-3]\(1\|3\|2\)两者都表示1或2或3?如果不是为什么?它们之间有什么区别?
  2. 为什么反向引用仅适用于\(\)

Wil*_*ard 8

关于第 1 部分:是的,两种模式都将匹配 1 或 2 或 3。

你的第一个问题的部分答案你的第二个问题。够可笑的。

括号用于启用反向引用,并阐明运算符优先级/分组。

方括号包含一个字符类。它们用于匹配内部字符集的一个实例。

例如,\(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}

  • 两个等效的表达式是 '\(1\|3\|2\)' 和 '\([1-3]\)'。括号替换 OR 表达式,而不是括号。 (2认同)

Cos*_*tas 5

  • ()表示 «groupping»,这意味着设置可以作为 1 项操作的字符串的一部分,也可以用于反向引用。
  • []表示符号

因此,如果您仅对单个符号使用括号,则含义是相同的。但通常它用于多符号字符串,如(cat|dog)