这是我正在使用的文件:
Shane有点打球 小的 愚蠢的
当我使用
egrep 's.*l' new
Run Code Online (Sandbox Code Playgroud)
我得到的输出为
沙恩有点爱打球 小的 傻丫头
当我使用
egrep 's.*?l' new
Run Code Online (Sandbox Code Playgroud)
我得到与上面相同的输出,但它应该是不同的。
尽管您说“它应该有所不同”,但您忽略了您期望的输出。据我所知,?
正则表达式中的可能解释是:
在基本正则表达式 (BRE) 中,?
是字面问号;由于您的输入不包含此类字符,因此输出grep 's.*?l' new
将为空。
在扩展正则表达式 (ERE) 中,?
是一个量词,表示零或前一个正则表达式原子之一。在这种情况下,.*?
是指“零个或多个单个字符(.*
),重复零次或一次(?
)” -这是等同于.*
,并因此egrep 's.*?l'
而egrep 's.*l'
将产生相同的输出。
在perl 兼容的正则表达式 (PCRE) 中,?
是一个贪婪修饰符,这样.*?
ins.*?l
匹配和之间的最短字符序列,而贪婪匹配最长的这样的序列。因此s
l
s.*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 -E
ERE 和grep -P
PCRE的习惯。