使用grep
(GNU grep 3.3)搜索所有包含三个连续双字母的单词(结果是"bookkeeper"):
grep -E "((.)2){3}" /usr/share/dict/american-english
将此更改为搜索包含三个双字母的单词,每个单词后面跟着字母"i"(导致"Mississippi"):
grep -E "((.)2i){3}" /usr/share/dict/american-english
将此更改为搜索包含三个双字母的单词,每个单词后面跟着任意一个字母(有几个结果):
grep -E "((.)2.){3}" /usr/share/dict/american-english
将此更改为搜索由可选的单个字母分隔的三个双字母的单词(甚至更多结果):
grep -E "((.)2.?){3}" /usr/share/dict/american-english
现在,最后,我最初的任务:搜索所有包含三个双字母的单词:
grep -E "((.)2.*){3}" /usr/share/dict/american-english
但是这导致一个空集合。为什么?.?
怎么匹配.*
不匹配的东西?
POSIX正则表达式引擎不能很好地处理反向引用的模式,匹配反向引用是一个NP完全问题,可能会提供一些提示,说明为什么它这么困难。
由于您使用的是GNUgrep
,这个问题很容易用PCRE引擎解决,
grep -P '((.)2.*){3}' file
因为PCRE引擎可以以比POSIX正则表达式引擎更有效的方式处理反向引用。
查看在线演示