0

我预计

egrep -i "((\w)\2){4,}" /usr/share/dict/words

匹配单词“subbookkeeper”,但它不匹配。

想法?

4

4 回答 4

3

显然 egrep 不支持{m,n}重复语法:

$ egrep -i '((\w)\2)((\w)\4)((\w)\6)' words 
bookkeeper
bookkeeping
subbookkeeper
$ egrep -i '((\w)\2)((\w)\4)((\w)\6)((\w)\8)' words 
subbookkeeper

如果你拼出这些组,它会起作用。

这是在我的 Mac 上。

于 2013-09-12T19:26:45.787 回答
2

问题似乎是 egrep 没有在重复时重置捕获的组。不确定这是一个错误还是符号所暗示的模棱两可。如果您手动重复,那么它应该可以工作:

egrep -i "(\w)\1(\w)\2(\w)\3(\w)\4" /usr/share/dict/words

然而,奇怪的是这不起作用。这在 perl 中确实有效:

perl -lne "print if /((\w)\2){3}/" /usr/share/dict/words

顺便说一句, egrep 确实支持 {m,n} 语法。这证明:

egrep -i "a{2}" /usr/share/dict/words
于 2013-09-12T19:40:19.637 回答
0

Your regex is correct and there is not a bug. /usr/share/dict/words does not contain the word "subbookkeeper".

于 2013-09-12T19:09:26.850 回答
0

在我的 freebsd 系统上,它确实找到了匹配项

[vaibhavc@freebsd-vai ~]$ cat acb
subbookkeeper

[vaibhavc@freebsd-vai ~]$ egrep "((\w)\2){4,}" -i acb
subbookkeeper
于 2013-09-12T19:24:52.833 回答