在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
的
为什么将\{
添加到正则表达式会消除除一个匹配之外的所有匹配。
答案 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
。