$ 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...