• 请不要在回答技术问题时复制粘贴 AI 生成的内容
Fu4ng
V2EX  ›  程序员

一个 grep 最小匹配的问题

  •  
  •   Fu4ng · Jul 5, 2021 · 2821 views
    This topic created in 1957 days ago, the information mentioned may be changed or developed.
    我获得符合模式的最小匹配项

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

    我想要的:
    aca

    但是:
    axxabca

    有什么办法呢?

    环境:
    MacOS
    谷歌了下,说是使用-P 参数可以,但是 MAC 的 grep 没有-P 参数
    9 replies  •  2021-07-06 23:06:26 +08:00
    raaaaaar
    raaaaaar
    Jul 5, 2021 via Android
    1
    分组捕获吗?我上午才遇到这个问题,P 选项是扩展语法才支持的,可以试下 sed 或者 cut,直接搜 grep 分组捕获就有答案
    Fu4ng
    Fu4ng
    OP
    Jul 5, 2021
    2
    @raaaaaar 好像不能解决啊。。
    AoEiuV020
    AoEiuV020
    Jul 5, 2021
    3
    做不到吧感觉,正则都是从左往右匹配,越前面的越先开始匹配,这个优先级是高于贪婪懒惰的,第一个 a 一定是最优先参与匹配的,不管后面有没有 a 满足条件,
    Fu4ng
    Fu4ng
    OP
    Jul 5, 2021
    4
    echo "axxabcaca" | awk '/a.*?c.*?a/{ print $0 }

    也不行。
    junyee
    junyee
    Jul 5, 2021
    5
    只能 grep -P 了吧。


    ```
    echo "axxabcaca" | grep -oe "a[^a]*c[^a]*a"
    ```
    lululau
    lululau
    Jul 5, 2021
    6
    brew install grep 或者 brew install the_silver_searcher
    no1xsyzy
    no1xsyzy
    Jul 6, 2021
    7
    正则是最左开始扫描, -P 应该也是解决不了的
    你要全局最短应当是反复去掉第一个字符重新扫描一遍,在所有的结果中找到最短的。更优化是每次从上次命中的第一个字符的后一个字符开始重新扫描。
    RexG
    RexG
    Jul 6, 2021
    8
    最先开始的匹配拥有最高的优先权 匹配规则优先级更高
    ooops
    ooops
    Jul 6, 2021 via iPhone
    9
    你可以把所有匹配的拿出来在筛最短的啊 为什么非要正则一步拿出来
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2142 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 42ms · UTC 14:32 · PVG 22:32 · LAX 06:32 · JFK 09:32
    ♥ Do have faith in what you're doing.