在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
为什么添加\{到正则表达式消除了除一个匹配之外的所有匹配.
我们来看看你写的字符类:
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.