正则表达式仅匹配最小

Dav*_*ues 8 regex perl pcre

我有一个像c.{0,2}?m和一个字符串的表达式"abcemtcmncefmf".目前,它会与3个字符串:cem,cmcefm(见这里).但在这种情况下,我喜欢只匹配其中最小的一个cm.

我的问题是我没有全局匹配支持,只有第一个匹配,因为我正在使用MariaDB REGEXP_SUBSTR()功能.我当前的解决方案是我创建的存储过程来解决我的问题.但它比简单情况下的正则表达式慢10倍.

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

我知道正则表达式(PCRE)有一些黑魔法功能,但我没有找到解决我问题的方法.


Cas*_*yte 4

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

/^(?|.*(cm)|.*(c.m)|.*(c..m))/s
Run Code Online (Sandbox Code Playgroud)

(结果在第1组)

或者像这样:

/^.*\Kcm|^.*\Kc.m|^.*\Kc..m/s
Run Code Online (Sandbox Code Playgroud)

第一个成功的分支获胜。