SQL如何使用正则表达式对数据进行过滤
作者:亿码平川 发布时间:2024-01-26 23:15:05
1、基本字符匹配
数据库使用正则进行过滤,写法与like语句非常相似,只需将“like"关键字改为"regexp"即可。我们先来看一个最简单的正则匹配:
select *
from mostimes
where name regexp '666'
分析:这条sql语句表达是字段中包含"666"即为匹配对象。
正则也可以像like语句那样任意匹配一个字符:
select *
from mostimes
where name regexp '.66'
分析:这里使用了正则表达式" .66 “,” . "是正则表达式语言中一个特殊的字符。它表示匹配任意一个字符,因此,566、666、766等都匹配且返回。
2、进行OR匹配
OR匹配与C语言的按位或很相似,使用" | "符号,表示符号两边任意一个串匹配了,即返回。用法如下所示:
select *
from mostimes
where name regexp '666|888'
分析:语句中使用了正则表达式"666|888"。" | "为正则表达式的OR操作符。它表示匹配其中之一,因此name字段为666和888都匹配并返回。
3、匹配几个字符之一
顾名思义,该方法是匹配多个字符中的其中一个,用法:
select *
from mostimes
where name regexp '[abc]mos'
分析:使用了正则表达式"[abc]mos"。[abc]定义一组字符,它的意思是匹配a或b或c,因此,amos、bmos和cmos都匹配且返回。
4、匹配范围
在第3个匹配方法中,我们可以对其进行简化,当我们需要匹配"[01234567]mos"时,我们还可以使用下面更简洁的方法:
select *
from mostimes
where name regexp '[0-7]mos'
分析:使用" - "可以简化这种连续字符类型的集合,此外,[a-z]也适用此方法。
5、匹配特殊字符
在前面的几种的匹配方式中,我们可以看到,正则表达式语言是由具有特定含义的特殊字符构成的,那如果我们想要匹配那些特殊字符的时候,就会出现sql注入问题,例如我们需要匹配" . “的时候,那么数据库就会将” . "当做一个任意通配符来匹配,达不到我们期望的值,这个时候我们就需要对其进行转义,例:
select *
from mostimes
where name regexp '\\.mos'
分析:可以看到,我们在‘.’符号的前面加了" \ “,加上双斜杆,数据库就会把” . "符号当做一个普通符号来匹配,其中还包括|、[]以及迄今为止使用过的其他特殊字符。
如果需要对‘\’进行转义时,那么我们就需要使用‘\\\’
6、匹配字符类
存在找出你自己经常使用的数字、所有字母字符或所有数字字母字符等的匹配。为更方便工作,可以使用预定义的字符集,称为字符类,具体可以看下表。
类 | 说明 |
---|---|
[:alnum:] | 任意字母和数字(同[a-zA-Z0-9]) |
[:alpha:] | 任意字符(同[a-zA-Z]) |
[:blank:] | 空格和制表(同[\t]) |
[:cntrl:] | ASCII控制字符(ASCII 0到31和127) |
[:digit:] | 任意数字(同[0-9]) |
[:graph:] | 与[:print:]相同,但不包括空格 |
[:lower:] | 任意小写字母(同[a-z]) |
[:print:] | 任意可打印字符 |
[:punct:] | 既不在[:alnum:]又不在[:cntrl:]中的任意字符 |
[:space:] | 包括空格在内的任意空白字符(同[\f\n\r\t\v]) |
[:upper:] | 任意大写字母(同[A-Z]) |
[:xdigit:] | 任意十六进制数字(同[a-fA-F0-9]) |
例子:
select *
from mostimes
where name REGEXP '[:alnum:]'
分析:表示匹配任意字母和数字,其他的大家可以试下。
7、匹配多个实例
在我们前面学习的几种正则表达式中,所有的匹配都是以单次出现进行匹配的。但有时候我们需要对匹配的次数进行更强的控制,这个时候我们就可以使用重复元字符来匹配。看下表:
元 字 符 | 说 明 |
---|---|
* | 0个或多个匹配 |
+ | 1个或多个匹配(等于{1,}) |
? | 0个或1个匹配(等于{0,1}) |
{n} | 指定数目的匹配 |
{n,} | 不少于指定数目的匹配 |
{n,m} | 匹配数目的范围(m不超过255) |
例子:
select *
from mostimes
where name REGEXP '[0-9]mostimes?'
分析:"[0-9]"表示匹配任意数字,"mostimes?"匹配mostime和mostimes(s后的?使s可选,因为?匹配它前面的任何字符的0次或1次出现),所以0mostime、1mostimes等都可以匹配。
8、定位符
现在有一个需求,就是需要在串中的指定位置匹配串,但是学的前面那几种都是在文本内任意位置查找匹配,那这个时候我们就可以使用定位符来解决。看下表:
元 字 符 | 说 明 |
---|---|
^ | 文本的开始 |
$ | 文本的结尾 |
[[:<:]] | 词的开始 |
[[:>:]] | 词的结尾 |
例子:
select *
from mostimes
where name REGEXP '^[0-9]mos'
分析:" ^ "表示匹配串的开始。所以该语句表示在串开头进行匹配,1mos、2mos、3mos等可以匹配,a1mos、aa1mos等不可以匹配。
9、like语句与正则
like语句与正则的相类似,但是它们的不同点就是like匹配的是整个串,而正则匹配的是子串,但是可以使用定位符“^”与“$”相结合,达到like语句的效果。
来源:https://blog.csdn.net/weixin_42372660/article/details/120028756


猜你喜欢
- 今天是 Firefox3的2008下载日 ,这就意味着Firefox3正式发布了。Firefox3有众多的改进和新功能,我最关注的功能之一是
- 前言最近在做项目的时候遇到一个问题,需要获取一个动态预览的图片的地址,这其实不是什么问题,主要是该图片的路径是写在css的backgroun
- 在本文中,我们将介绍 Python 中 _ 字符的不同用法。就像 Python 中的许多其他内容一样,我们会看到 “_” 的不同用法主要是惯
- 第一种 使用pygame模块 pygame.mixer.init() pygame.mixer.music.load
- 直接赋值:其实就是对象的引用(别名)。浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象。深拷贝(deepcopy): copy 模
- ndarray的转置(transpose)对于A是由np.ndarray表示的情况:可以直接使用命令A.T。也可以使用命令A.transpo
- 最近将Jesse James Garrett的《用户体验的要素》一书读了两遍,做一些简要的摘录并添加一些个人注释。当然,一本好书绝对不是简单
- 本文实例为大家分享了python控制nao机器人身体动作的具体代码,供大家参考,具体内容如下今天读的代码,顺便写了出来,与文档的对比,差不多
- 在设计数据窗口时,在所有列的Background.Color属性中编写如下表达式: if ( IsRowNew(), 1090519039,
- splinter介绍 Splinter是一个使用Python测试Web应用程序的开源工具,可以自动化浏览器操作,例如访问URL和与它们的项
- 一、如何理解本条内容:一个“简单”和“复杂”的例子在我和开发人员沟通一个项目需求的时候,他们频频慨叹Mockup的设计所考虑情况之细致,很多
- 以channel Attention Block为例子class CAB(nn.Module):def __init__(self, in_
- 前面的话发布一个版本时,我们通常先在版本库中打一个标签(tag)。这样,就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的版本,就
- 很多开发者进行数据库设计的时候往往并没有太多的考虑char, varchar类型,有的是根本就没注意,因为存储价格变得越来越便宜了,忘记了最
- 一、概述现有一个wenda1.xlsx文件,内容如下:需要将faq记录合并为一行,效果如下:注意:faq记录,每一行用||来拼接。二、多行转
- 这里针对smtplib做了一系列封装,可以完成以下四种场景:发送纯文本的邮件发送html页面的邮件发送带附件文件的邮件发送能展示图片的邮件以
- 本文实例讲述了JS获取数组最大值、最小值及长度的方法。分享给大家供大家参考,具体如下://最小值Array.prototype.min =
- Git 基本操作Git 的工作就是创建和保存你项目的快照及与之后的快照进行对比。本章将对有关创建与提交你的项目快照的命令作介绍。获取与创建项
- 这是通过博主写的英雄联盟下载器下载的部分的英雄皮肤,可以看一下效果。每个英雄的皮肤的会自动根据英雄名称创建相应的文件夹存放。实现思路比较简单
- 目录1. 字符串拆分函数.split()2. 字符串拼接函数.join()扩展:理解" ".join(s.split(&