$ 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 正则表达式调试输出:
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...
关于regex - 为什么这个正则表达式不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20111948/