MySQL不支持负向前瞻正则:如何筛选仅含两个点的帖子
解决MySQL不支持负向前瞻的正则筛选问题
嘿,这个坑我之前踩过!MySQL的正则引擎确实不支持PCRE里的负向前瞻((?!...))和负向后顾((?<!...))语法,所以得换个思路来实现你“筛选仅包含两个连续点、排除三个及以上连续点”的需求。
可行的解决方案
我们可以把需求拆成两个互补的条件,用逻辑与(AND)组合起来:
- 先排除所有包含三个及以上连续点的记录:用
NOT REGEXP '\.{3,}'过滤掉有...、....这类内容的行 - 再筛选出包含至少一组两个连续点的记录:用
REGEXP '\.{2}'确保行里存在..
最终的SQL语句长这样:
SELECT * FROM table WHERE column REGEXP '\.{2}' AND column NOT REGEXP '\.{3,}';
为什么这个方法管用?
- 第一步排除了所有有三个及以上连续点的内容,剩下的行里最多只有单个点或者两个连续点的组合
- 第二步再从中挑出确实存在两个连续点的行,就完美匹配了你要的“仅包含两个连续点、没有更多连续点”的需求
举个例子,以下内容会被正确筛选:
foo..bar..startend..
而这些内容会被排除:
foo...bar(三个连续点)foo.bar.baz(只有单个点)foo....bar(四个连续点)
额外说明
如果你的需求是“整个字符串恰好只有两个点(不管是否连续)”,那可以调整条件为:
SELECT * FROM table WHERE LENGTH(column) - LENGTH(REPLACE(column, '.', '')) = 2;
不过从你最初写的正则来看,应该是要匹配连续的两个点,所以第一种方案更贴合你的需求。
内容的提问来源于stack exchange,提问作者enok
相关产品推荐
相关产品推荐

