gpt4 book ai didi

regex - 如何 grep/perl/awk 重叠正则表达式

转载 作者:行者123 更新时间:2023-12-01 23:13:05 27 4
gpt4 key购买 nike

尝试将字符串通过管道传输到 grep/perl 正则表达式中以提取重叠的匹配项。目前,结果似乎只拉出没有任何“回顾”的连续匹配:

尝试使用 egrep(在 GNU 和 BSD 上):

$ echo "bob mary mike bill kim jim john" | egrep -io "[a-z]+ [a-z]+"
bob mary
mike bill
kim jim

尝试使用 perl 风格的 grep (-P):

$ echo "bob mary mike bill kim jim john" | grep -oP "()[a-z]+ [a-z]+"
bob mary
mike bill
kim jim

尝试使用 awk 仅显示第一个匹配项:

$ echo "bob mary mike bill kim jim john" | awk 'match($0, /[a-z]+ [a-z]+/) {print substr($0, RSTART, RLENGTH)}'
bob mary

我希望从一个简单的工作 bash 管道命令中看到的重叠结果是:

bob mary
mary mike
mike bill
bill kim
kim jim
jim john

有什么想法吗?

最佳答案

Lookahead 是你的 friend

echo "bob mary mike bill kim jim john" | 
perl -wnE'say "$1 $2" while /(\w+)\s+(?=(\w+))/g'

重点是,作为“零宽度断言”的前瞻性不会消耗任何东西——但它仍然允许我们捕获其中的模式。

因此,当正则表达式引擎匹配一个单词和空格 ((\w+)\s+) 时,吞噬它们,然后停在那里并“向前看”,只是为了“断言”那里有寻求的模式;它不会从最后一个空格和下一个 \w 之间的位置移动,也不会像他们所说的那样“消耗”下一个单词。

很高兴我们还可以捕获“看到”的模式,即使它没有被消耗!所以我们得到了 $1$2 这两个词。

然后,由于 /g 修饰符,引擎继续寻找另一个单词+空格,后面还有另一个单词。下一个词是我们前瞻性发现的词——所以现在一个词被消耗了,但下一个词是“寻找”(并捕获)的。等等

参见 Lookahead and lookbehind assertions in perlretut

关于regex - 如何 grep/perl/awk 重叠正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69459402/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com