Grep模糊嵌套方括号

时间:2013-02-15 09:43:26

标签: regex grep

sample.txt包含

abcde
abde

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

  1. grep '[[ab]]' sample.txt - 无输出
  2. grep '[ab[]]' sample.txt - 无输出
  3. grep '[ab[]' sample.txt - 输出为abcdeabde
  4. grep '[ab]]' sample.txt - 无输出
  5. [(ab)][^(ab)]是什么意思?是否与[ab][^ab]相同?

2 个答案:

答案 0 :(得分:5)

首先要理解的是,在一个字符类中,正则表达式的元字符都没有任何特殊含义。它们字面上匹配。例如,*将匹配*,并不代表0 or 1重复。同样,()将匹配(),并且不会创建capture group

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


124中,您的角色类在第一个结束时]结束。因此,最后一个结束括号 - ]不是字符类的一部分。它必须单独匹配。所以,你的模式将匹配这样的东西:

'[[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.

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

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

'[ab[]' means match string that contains 'a', or 'b', or '['

完全有效并匹配字符串。


  

[(ab)][^(ab)]是什么意思?

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

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


  

是否与[ab][^ab]相同?

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

答案 1 :(得分:2)

我试一试:

grep '[[ab]]' - match string  which has one of "[,a,b" and then a "]" char followed
grep '[ab[]]' - match string  which has one of "a,b,[" and then a "]" char followed
grep '[ab[]'  - match string  which has one of "a,b,["
grep '[ab]]'  - match string  which has one of "a,b" and then a "]" char followed
grep '[(ab)]' - match string  which has one of "(,a,b,)"
grep '[^(ab)]' - match string  which doesn't contain "(,a,b" and ")"
grep '[ab]'    - match string  which contains one of "a,b"
grep '[^ab]' - match string  which doesn't contain "a" and "b"

您可以在此示例中查看grep cmds:

#create a file with below lines:
abcde
abde
[abcd
abcd]
abc[]foo
abc]bar
[ab]cdef
a(b)cde

你会看到差异,并用我的评论/解释来考虑它。