一个 grep 最小匹配的问题

2021-07-05 17:55:29 +08:00
 Fu4ng
我获得符合模式的最小匹配项

比如:
echo "axxabcaca" | egrep -oe "a.*?c.*?a"

我想要的:
aca

但是:
axxabca

有什么办法呢?

环境:
MacOS
谷歌了下,说是使用-P 参数可以,但是 MAC 的 grep 没有-P 参数
1640 次点击
所在节点    程序员
9 条回复
raaaaaar
2021-07-05 18:00:20 +08:00
分组捕获吗?我上午才遇到这个问题,P 选项是扩展语法才支持的,可以试下 sed 或者 cut,直接搜 grep 分组捕获就有答案
Fu4ng
2021-07-05 18:13:48 +08:00
@raaaaaar 好像不能解决啊。。
AoEiuV020
2021-07-05 18:17:22 +08:00
做不到吧感觉,正则都是从左往右匹配,越前面的越先开始匹配,这个优先级是高于贪婪懒惰的,第一个 a 一定是最优先参与匹配的,不管后面有没有 a 满足条件,
Fu4ng
2021-07-05 19:36:02 +08:00
echo "axxabcaca" | awk '/a.*?c.*?a/{ print $0 }

也不行。
junyee
2021-07-05 20:10:45 +08:00
只能 grep -P 了吧。


```
echo "axxabcaca" | grep -oe "a[^a]*c[^a]*a"
```
lululau
2021-07-05 20:19:27 +08:00
brew install grep 或者 brew install the_silver_searcher
no1xsyzy
2021-07-06 11:06:58 +08:00
正则是最左开始扫描, -P 应该也是解决不了的
你要全局最短应当是反复去掉第一个字符重新扫描一遍,在所有的结果中找到最短的。更优化是每次从上次命中的第一个字符的后一个字符开始重新扫描。
RexG
2021-07-06 15:38:25 +08:00
最先开始的匹配拥有最高的优先权 匹配规则优先级更高
ooops
2021-07-06 23:06:26 +08:00
你可以把所有匹配的拿出来在筛最短的啊 为什么非要正则一步拿出来

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/787690

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX