Mysql 正则表达式在SQL查询中的使用

Mysql 正则表达式在SQL查询中的使用,mysql,sql,regex,Mysql,Sql,Regex,正在尝试从数据库中仅选择XY-XY-XY系列: create table numbers (number varchar(10)); insert into numbers (number) values ('9999999999'), ('5532003644'), ('1212121205'), ('1103220311'), ('11212

正在尝试从数据库中仅选择XY-XY-XY系列:

create table numbers (number varchar(10));
insert into numbers (number) values
('9999999999'),
('5532003644'), 
('1212121205'),                                      
('1103220311'),                                     
('1121212128'),
('1234123425');                                    
给我结果:

12121205、1121212128和1234123425

1234123425是XY-XY-XY系列吗


问题的一部分在于你没有摆脱反斜杠。反斜杠是字符串转义和regexp转义;要将其放入regexp引擎,需要为字符串解析器转义它。否则,\2将被简单地视为2,因此[0-9]\2匹配后跟2的任何数字


但是您不需要使用反向引用\2将匹配[0-9]匹配的任何内容,这将使您的代码查找XX,而不是XY。我不认为有一种方法可以编写一个regexp,在其中匹配除back引用以外的任何字符。

部分问题在于没有逃逸反斜杠。反斜杠是字符串转义和regexp转义;要将其放入regexp引擎,需要为字符串解析器转义它。否则,\2将被简单地视为2,因此[0-9]\2匹配后跟2的任何数字


但是您不需要使用反向引用\2将匹配[0-9]匹配的任何内容,这将使您的代码查找XX,而不是XY。我不认为有一种方法可以编写一个regexp,其中除了back引用之外,您可以匹配任何字符。

您所有的问题都是有趣的sql难题。 此解决方案也不涉及正则表达式:

SELECT * FROM numbers
where number regexp '(.*([0-9])\2.*){3}'

你所有的问题都是有趣的sql谜题。 此解决方案也不涉及正则表达式:

SELECT * FROM numbers
where number regexp '(.*([0-9])\2.*){3}'

这不是一个很好的答案,但是你可以用正则表达式来实现。问题是MySQL不支持反向引用。博士后是这样的,所以以下是你想要的:

| number     |
| ---------- |
| 1212121205 |
| 1121212128 |

这不是一个很好的答案,但是你可以用正则表达式来实现。问题是MySQL不支持反向引用。博士后是这样的,所以以下是你想要的:

| number     |
| ---------- |
| 1212121205 |
| 1121212128 |

是一个dbfiddle。

我觉得奇怪的是,您的查询返回了所有与正则表达式不匹配的结果。。。这些是你预期的结果吗?我一点也不明白。[0-9]\2如何匹配XY?它不应该匹配XX吗?@第四鸟我的预期结果只有:12121205&1121212128@Barmar那么,匹配XY的正则表达式是什么呢?我发现奇怪的是,您的查询返回的结果与正则表达式不匹配。。。这些是你预期的结果吗?我一点也不明白。[0-9]\2如何匹配XY?它不应该匹配XX吗?@第四鸟我的预期结果只有:12121205&1121212128@Barmar那么,匹配XY的正则表达式是什么呢?我想,它会给出我预期的结果。这有什么问题吗?我想,这会给我预期的结果。这有什么问题吗?如果我想要XYZ-XYZ,我会的。这是正确的方法吗?不,因为我假设您希望XYZ的所有3个字符都不同,或者至少不完全相同。这更复杂。是的,完全不同!与LeftSubstring n.number、s.start、2、1 RightSubstring n.number、s.start、3、1比较XYZ的第一个字符和最后一个字符不同的是,必须对XYZ进行3次比较,第一次与第二次比较,第一次与3d比较,第二次与3d比较都必须不同。我认为我非常接近结果:如果我想要XYZ-XYZ,我就要。这是正确的方法吗?不,因为我假设您希望XYZ的所有3个字符都不同,或者至少不完全相同。这更复杂。是的,完全不同!与LeftSubstring n.number、s.start、2、1 RightSubstring n.number、s.start、3、1比较XY的第一个字符和最后一个字符不同,您必须对XYZ进行3次比较,第一次与第二次比较,第一次与3d比较,第二次与3d比较都必须不同。我认为我非常接近结果: