如何构造正则表达式匹配给定超级字符串的所有合法子串
匹配参考串子串的正则实现方案
你需要实现的逻辑本质是:判断任意待检测字符串是否是给定参考串 A789Lfu891MatchMe2ENOTSTH 的连续子串,和你给出的SQL逻辑完全等价:参考串是否包含待检测串作为子串。
最通用的正向实现方案
优先推荐动态构造正则的方式,兼容绝大多数编程语言的正则引擎:
对于任意待检测字符串 t,构造正则如下:
/\Q${escapeRegExp(t)}\E/
将该正则作用于参考串 A789Lfu891MatchMe2ENOTSTH,只要能匹配成功,就说明 t 是参考串的子串。
注:
\Q和\E是正则原义符,包裹的内容会被当做普通字符串匹配,避免待检测串里的特殊正则字符(如.*)造成逻辑异常。如果你的编程语言没有原生的正则转义方法,可以手动将t中的特殊正则字符做转义处理。
效果验证
- 待检测串为
MatchMe时,构造的正则是/\QMatchMe\E/,可以在参考串中匹配到,符合预期 - 待检测串为
ENOTST时,构造的正则是/\QENOTST\E/,可以在参考串中匹配到,符合预期 - 待检测串为
891时,构造的正则是/\Q891\E/,可以在参考串中匹配到,符合预期 - 待检测串为
foo时,构造的正则是/\Qfoo\E/,无法在参考串中匹配到,符合预期 - 所有带
_extra后缀/前缀的待检测串,内容包含参考串中不存在的字符,无法匹配,符合预期
固定正则(无需动态拼接,适用PCRE/高版本JS引擎)
如果需要一个固定的正则表达式,直接作用于待检测字符串本身就能判断是否符合要求,可以用以下写法:
/^(?<=.*\Q$0\E)A789Lfu891MatchMe2ENOTSTH(*SKIP)(*FAIL)|^.+$/
注:该写法依赖正则引擎支持可变长度反向环视,测试时直接用该正则匹配待检测字符串,匹配成功即说明是参考串的子串。
最简非正则实现
如果不强制要求用正则,直接用语言内置的字符串包含判断即可,性能远高于正则:
- JS示例:
'A789Lfu891MatchMe2ENOTSTH'.includes(t) - Python示例:
t in 'A789Lfu891MatchMe2ENOTSTH'
内容的提问来源于stack exchange,提问作者Ted Armstrong
相关产品推荐
相关产品推荐

