为什么这些看起来不可能的正则表达式匹配这些字符串?

时间:2016-09-13 14:44:57

标签: regex perl pcre

在Perl我有

    if ($_ =~ /$search/)
    {
        print STDERR "$search matches $_";
        ...

输出

^[\s\t]*#?[\s\t]*unix_listener[\s\t\]+auth-userdb[\s\t]* matches   unix_listener lmtp {
^[\s\t]*#?[\s\t]*unix_listener[\s\t\]+auth-userdb[\s\t]* matches   unix_listener auth-userdb {
^[\s\t]*#?[\s\t]*unix_listener[\s\t\]+auth-userdb[\s\t]* matches   #unix_listener /var/spool/postfix/private/auth {
^[\s\t]*#?[\s\t]*unix_listener[\s\t\]+auth-userdb[\s\t]* matches   unix_listener dict {

这似乎是不可能的,因为$_个字符串中只有一个包含auth-userdb

更奇怪的是,通过在正则表达式的末尾添加\{我得到了

^[\s\t]*#?[\s\t]*unix_listener[\s\t\]+auth-userdb[\s\t]*\{ matches   unix_listener lmtp {

但没有其他匹配(在同一输入上)。

我认为我完全理解了这种类型的正则表达式,但我无法弄清楚这里的逻辑。

有人请解释

  • 为什么前四个$_行匹配$search而不是仅包含auth-userdb

  • 为什么将\{添加到正则表达式会消除除一个匹配之外的所有匹配。

1 个答案:

答案 0 :(得分:8)

让我们来看看你写的字符类:

Start                 End
|                       |
v                       v
[\s\t\]+auth-userdb[\s\t]
      ^
      |
      Because this is escaped

所以你有效地拥有:

[abdeh-u\[\]+\s\t]

将整个正则表达式替换为^\s*#?\s*unix_listener\s+auth-userdb\s*,因为\t中包含\s