正则表达式“.*?” 给出与“.*”相同的输出

0 command-line regex grep

这是我正在使用的文件:

Shane有点打球
小的
愚蠢的

当我使用

egrep 's.*l' new
Run Code Online (Sandbox Code Playgroud)

我得到的输出为

沙恩有点爱打球
小的
傻丫头

当我使用

egrep 's.*?l' new
Run Code Online (Sandbox Code Playgroud)

我得到与上面相同的输出,但它应该是不同的。

ste*_*ver 6

尽管您说“它应该有所不同”,但您忽略了您期望的输出。据我所知,?正则表达式中的可能解释是:

  • 基本正则表达式 (BRE) 中?是字面问号;由于您的输入不包含此类字符,因此输出grep 's.*?l' new将为空。

  • 扩展正则表达式 (ERE) 中?是一个量词,表示零或前一个正则表达式原子之一。在这种情况下,.*?是指“零个或多个单个字符(.*),重复零次或一次(?)” -这是等同于.*,并因此egrep 's.*?l'egrep 's.*l'将产生相同的输出。

  • perl 兼容的正则表达式 (PCRE) 中?是一个贪婪修饰符,这样.*?ins.*?l匹配和之间的最短字符序列,而贪婪匹配最长的这样的序列。因此sls.*l

    $ grep -P 's.*?l' new
    Shane is a little to play ball
           ^^^^^
    
    Run Code Online (Sandbox Code Playgroud)

    尽管

    $ grep -E 's.*?l' new
    Shane is a little to play ball
           ^^^^^^^^^^^^^^^^^^^^^^^
    
    Run Code Online (Sandbox Code Playgroud)

对于简单的情况,您可以?通过使用否定字符集,即在没有 PCRE修饰符的情况下实现“懒惰”

grep 's[^l]*l' new
Run Code Online (Sandbox Code Playgroud)

将匹配s后跟任何字符,除了 l, 后跟l.


旁白:egrep在技​​术上已弃用 - 您应该养成将 use plaingrep用于 BRE、grep -EERE 和grep -PPCRE的习惯。