regex - 正则表达式只匹配最小的

标签 regex perl pcre

我有一个类似 c.{0,2}?m 的表达式和像 "abcemtcmncefmf" 这样的字符串.目前它将匹配三个子字符串:cem , cmcefm ( see here )。但我喜欢只匹配最小的,在这种情况下,cm .

我的问题是我没有全局匹配支持,只有第一个匹配,因为我使用的是 MariaDB REGEXP_SUBSTR() 功能。我目前的解决方案是 stored procedure我为解决我的问题而创建的。但它比简单情况下的正则表达式慢 10 倍。

我也尝试做类似的事情:(cm|c.{0,1}?m|c.{0,2}?m) ,但它不起作用,因为它将匹配任何组模式中的第一个,而不是在所有主题字符串中逐一尝试。

我知道正则表达式 (PCRE) 有一些黑魔法功能,但我没有发现任何东西可以解决我的问题。

  • 备注 :我还在当前模式中使用非贪婪模式( .{0,2}? );
  • 问题 Regular expression to find smallest possible match 不要是我的问题;
  • 最佳答案

    您可以简单地在分支重置组中使用交替:

    /^(?|.*(cm)|.*(c.m)|.*(c..m))/s
    

    (结果在第1组)

    或者像这样:
    /^.*\Kcm|^.*\Kc.m|^.*\Kc..m/s
    

    第一个成功的分支获胜。

    关于regex - 正则表达式只匹配最小的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35091745/

    相关文章:

    regex - 在 R 中组合字符向量中的行

    javascript - 在 Javascript 中解析 BBCode

    c - GCC 链接器无法找到库

    regex - 仅用一个正则表达式进行多次替换

    javascript - 使用 lodash 在 JavaScript 数组中进行字符串操作

    c# - 在 C# 中设置的 2 个单词字符串中拆分字符串

    javascript - 在 Perl 中使用 WWW::Scripter 模块时,如何获取尽可能多的调试流量信息?

    perl - 为什么inotify会丢失事件?

    perl - 修改 .xlsx 文件(Excel 2007 及更高版本)

    regex - 以下正则表达式如何工作?