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

spr*_*aff 0 regex perl pcre

在Perl我有

    if ($_ =~ /$search/)
    {
        print STDERR "$search matches $_";
        ...
Run Code Online (Sandbox Code Playgroud)

哪个输出

^[\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 {
Run Code Online (Sandbox Code Playgroud)

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

甚至更奇怪,通过\{在正则表达式的末尾添加一个我得到的

^[\s\t]*#?[\s\t]*unix_listener[\s\t\]+auth-userdb[\s\t]*\{ matches   unix_listener lmtp {
Run Code Online (Sandbox Code Playgroud)

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

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

有人请解释一下

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

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

Tho*_*oub 8

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

Start                 End
|                       |
v                       v
[\s\t\]+auth-userdb[\s\t]
      ^
      |
      Because this is escaped
Run Code Online (Sandbox Code Playgroud)

所以你有效地拥有:

[abdeh-u\[\]+\s\t]
Run Code Online (Sandbox Code Playgroud)

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