regex - 为什么这个正则表达式不起作用?

标签 regex perl bash grep echo

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

相关文章:

java - 如果找不到匹配项,替换会做什么? (在引擎盖下)

arrays - Perl - 有效区分超大数组的最佳实践

sql - 如何在 Perl 5 中将此 Unicode 表导出为 CSV?

bash - shell bash - 返回码

arrays - 如何在 Bash 中将字符串转换为十六进制

bash - Shell:如何获取包含一些字符串的容器名称

python - 字符串由标点组成

C 编程 - 如何匹配字符串的结束字符?

java - 我如何更改 Ant grep 使其正则表达式中具有 unix 样式 "or"?

perl - 限制在 Perl 脚本中执行的程序的同时实例数(>1)