$ echo '!abcae20' | grep -o -P '(?=.*\d)\w{4,}'

这不会产生任何结果。
但以下是有效的:
$ echo '!abcae20' | grep -o -P '.*?(?=.*\d)\w{4,}'

!abcae20

有人能给我解释一下吗?

最佳答案

这是有效的:

echo '!abcae20' | grep -o -P '.*?(?=.*\d)\w{4,}

因为.*?匹配!(?=.*\d)匹配abcae20\w{4,}匹配abcae20。
在这个例子中:
echo '!abcae20' | grep -o -P '(?=.*\d)\w{4,}'

前视匹配!abcae20,贪婪。但是,\w{4,}!不匹配,因此失败。
以下是失败的perl regex调试输出:
Matching REx "(?=.*\d)\w{4,}" against "!abcae20"
   0 <> <!abcae20>           |  1:IFMATCH[0](8)
   0 <> <!abcae20>           |  3:  STAR(5)
                                    REG_ANY can match 8 times out of 2147483647...
   8 <!abcae20> <>           |  5:    DIGIT(6)
                                      failed...
   7 <!abcae2> <0>           |  5:    DIGIT(6)
   8 <!abcae20> <>           |  6:    SUCCEED(0)
                                      subpattern success...
   0 <> <!abcae20>           |  8:CURLY {4,32767}(11)
                                  ALNUM can match 0 times out of 2147483647...
                                  failed...

08-05 10:35