我有一个类似 c.{0,2}?m
的表达式和像 "abcemtcmncefmf"
这样的字符串.目前它将匹配三个子字符串:cem
, cm
和 cefm
( see here )。但我喜欢只匹配最小的,在这种情况下,cm
.
我的问题是我没有全局匹配支持,只有第一个匹配,因为我使用的是 MariaDB REGEXP_SUBSTR()
功能。我目前的解决方案是 stored procedure我为解决我的问题而创建的。但它比简单情况下的正则表达式慢 10 倍。
我也尝试做类似的事情:(cm|c.{0,1}?m|c.{0,2}?m)
,但它不起作用,因为它将匹配任何组模式中的第一个,而不是在所有主题字符串中逐一尝试。
我知道正则表达式 (PCRE) 有一些黑魔法功能,但我没有发现任何东西可以解决我的问题。
.{0,2}?
); 最佳答案
您可以简单地在分支重置组中使用交替:
/^(?|.*(cm)|.*(c.m)|.*(c..m))/s
(结果在第1组)
或者像这样:
/^.*\Kcm|^.*\Kc.m|^.*\Kc..m/s
第一个成功的分支获胜。
关于regex - 正则表达式只匹配最小的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35091745/