Grep模糊嵌套方括号

Exp*_*rer 4 regex grep

sample.txt 包含

abcde
abde
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释以下命令的输出 -

  1. grep '[[ab]]' sample.txt - 没有输出
  2. grep '[ab[]]' sample.txt - 没有输出
  3. grep '[ab[]' sample.txt - 输出是abcde,abde
  4. grep '[ab]]' sample.txt - 没有输出

又是什么[(ab)][^(ab)]意味着什么呢?是不是一样[ab][^ab]

Roh*_*ain 5

首先要理解的是,在字符类中,正则表达式的元字符都没有任何特殊含义.它们字面上匹配.例如,a *将匹配a *并且不意味着0 or 1重复.同样,()将匹配(),而且不会产生capture group.

现在,如果]在字符类中找到a,则会自动关闭字符类,而另一个字符将不是该字符类的一部分.现在,让我们了解上面发生的事情:


1,, 24,你的角色类在第一次结束时结束].所以,最后一个结束括号 - ]不是字符类的一部分.它必须单独匹配.所以,你的模式将匹配如下:

'[[ab]]' is same as '([|a|b)(])'  // The last `]` has to match.
'[ab[]]' is same as '(a|b|[)(])'  // Again, the last `]` has to match.
'[ab]]'  is same as '(a|b|])(])'  // Same, the last `]` has to match.
    ^
    ^---- Character class closes here.
Run Code Online (Sandbox Code Playgroud)

现在,因为在两个字符串中,]最后都没有,因此找不到匹配.

然而,在第3种模式中,您的角色类仅由最后一个关闭].因此,一切都在角色类中.

'[ab[]' means match string that contains 'a', or 'b', or '['
Run Code Online (Sandbox Code Playgroud)

这是完全有效的,并匹配字符串.


又是什么[(ab)][^(ab)]意味着什么呢?

[(ab)]装置匹配任何的(,a,b,).请记住,在角色类中,正则表达式的元字符没有任何特殊含义.因此,您无法在字符类中创建组.

[^(ab)]意思是完全相反的[(ab)].它匹配任何不包含任何指定字符的字符串.


是不是一样[ab][^ab]

不,这两个不包括().因此他们没什么不同.