当前位置: 首页 > news >正文

正则表达式 - 简单模式匹配

目录

一、测试数据

二、简单模式匹配

1. 匹配字面值

2. 匹配数字和非数字字符

3. 匹配单词与非单词字符

4. 匹配空白字符

5. 匹配任意字符

6. 匹配单词边界

7. 匹配零个或多个字符

8. 单行模式与多行模式


一、测试数据

        这里所用文本是《学习正则表达式》这本书带的,是《抒情歌谣集》(Lyrical Ballads, London, J.&A. Arch, 1798)中收录的塞缪尔·泰勒·柯勒律治的一首诗“The Rime of the Ancient” 的前几行。为了演示正则表达式的单行模式与多行模式,特意生成了带有换行符(ascii 10)的单个行,和不带换行符的多个行。

drop table if exists t_regexp;
create table t_regexp(a text);
insert into t_regexp values (
'THE RIME OF THE ANCYENT MARINERE, IN SEVEN PARTS.
ARGUMENT.
How a Ship having passed the Line was driven by Storms to the cold Country
towards the South Pole; and how from thence she made her course to the tropical
Latitude of the Great Pacific Ocean; and of the strange things that befell;
and in what manner the Ancyent Marinere came back to his own Country.
I.
1       It is an ancyent Marinere,
2          And he stoppeth one of three:
3       "By thy long grey beard and thy glittering eye
4          "Now wherefore stoppest me?');insert into t_regexp values ('THE RIME OF THE ANCYENT MARINERE, IN SEVEN PARTS.'),
('ARGUMENT.'),
('How a Ship having passed the Line was driven by Storms to the cold Country'),
('towards the South Pole; and how from thence she made her course to the tropical'),
('Latitude of the Great Pacific Ocean; and of the strange things that befell;'),
('and in what manner the Ancyent Marinere came back to his own Country.'),
('I.'),
('1       It is an ancyent Marinere,'),
('2          And he stoppeth one of three:'),
('3       "By thy long grey beard and thy glittering eye'),
('4          "Now wherefore stoppest me?');

二、简单模式匹配

1. 匹配字面值

        匹配字符串字面值的方法就是使用普通的字符。例如 regexp_like(a,'Ship') 函数的意思是匹配字段 a 中带有 Ship 文本的行,缺省不区分大小写。执行结果如下:

mysql> select a from t_regexp where regexp_like(a,'Ship')\G
*************************** 1. row ***************************
a: THE RIME OF THE ANCYENT MARINERE, IN SEVEN PARTS.
ARGUMENT.
How a Ship having passed the Line was driven by Storms to the cold Country
towards the South Pole; and how from thence she made her course to the tropical
Latitude of the Great Pacific Ocean; and of the strange things that befell;
and in what manner the Ancyent Marinere came back to his own Country.
I.
1       It is an ancyent Marinere,
2          And he stoppeth one of three:
3       "By thy long grey beard and thy glittering eye
4          "Now wherefore stoppest me?
*************************** 2. row ***************************
a: How a Ship having passed the Line was driven by Storms to the cold Country
2 rows in set (0.00 sec)

2. 匹配数字和非数字字符

        以下三个查询等价,都是匹配字段 a 中带有数字的行。

select a from t_regexp where regexp_like(a,'[0123456789]');
select a from t_regexp where regexp_like(a,'[0-9]');
select a from t_regexp where regexp_like(a,'\\d');

        匹配以数字开头的行:

select a from t_regexp where regexp_like(a,'^\\d');

        匹配纯数字行:

select a from t_regexp where regexp_like(a,'^\\d+$');

        使用字符组可精确匹配字符。数字的字符组简写式 \d 更为简短,但却没有字符组强大、灵活。在无法使用 \d 时(不是所有情况下都支持这种方式),或者想匹配特定数字时,就需要使用字符组;合适的时候可以使用 \d,因为它更简短。

        以下四个查询等价,都是匹配字段 a 中带有非数字的行。

select a from t_regexp where regexp_like(a,'[^0123456789]');
select a from t_regexp where regexp_like(a,'[^0-9]');
select a from t_regexp where regexp_like(a,'[^\\d]');
select a from t_regexp where regexp_like(a,'\\D');

        匹配纯字母行:

select * from t_regexp where regexp_like(a,'^\\D+$');

        要匹配非数字字符,可使用包含以下大写字母D的简写式 \D。注意字符组(中括号内)中的 ^ 符号不再代表行头而是表示取反,意思其实就是“不匹配这些”或“匹配除这些以外的内容”。

3. 匹配单词与非单词字符

        \w 简写式将匹配所有的单词字符,\D 与 \w 的区别是 \D 会匹配空格、标点符号(引号、连字符、反斜杠、方括号)等字符,而 \w 只匹配字母、数字和下划线。在英语环境中,与 \w 匹配相同内容的字符组为:[_a-zA-Z0-9]

        \W 匹配非单词字符,匹配空格、标点以及其他非字母、非数字字符。使用以下字符组也可以匹配相同的内容:[^_a-zA-Z0-9]

        下表提供了更多的字符简写式。

字符简写式

描述

\a

报警符

[\b]

退格字符

\c x

控制字符

\d

数字字符

\D

非数字字符

\w

单词字符

\W

非单词字符

\0

空字符

\x xx

字符的十六进制值

\o xxx

字符的八进制值

\u xxx

字符的Unicode值

        匹配所有emoji表情:

select userid,nickname from space_user where regexp_like(nickname,'(\\ud83c[\\udf00-\\udfff])|(\\ud83d[\\udc00-\\ude4f\\ude80-\\udeff])|[\\u2600-\\u2B55]') limit 10;

        \w 不匹配符号:

select regexp_like('()','\\w'),regexp_like('()','\\W'),regexp_like('()','\\D');

        匹配电子邮箱:

select regexp_like('wxy0327@sohu.com','\\w[-\\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}');

4. 匹配空白字符

        \s 与 [ \t\n\r] 字符组匹配的内容相同,它会匹配空格、制表符(\t)、换行符(\n)、回车符(\r)。\s也有对应的大写形式,如要匹配非空白字符,使用 \S 或 [^ \t\n\r] 或 [^\s]。

        下表列出了匹配常见和不太常见的空白字符的简写式。

字符简写式

描述

\f

换页符

\h

水平空白符

\H

非水平空白符

\n

换行符

\r

回车符

\s

空白符

\S

非空白符

\t

水平制表符

\v

垂直制表符

\V

非垂直制表符

5. 匹配任意字符

        用正则表达式匹配任意字符的一种方法就是使用点号(U+002E)。点号可以匹配除行结束符之外的所有字符,个别情况除外。要匹配THE RIME整个短语,则可使用八个点号,但推荐用量词 .{8}

        这个表达式就能匹配前两个单词以及它们之间的空格,但只是粗略地匹配。从 https://www.dute.org/regex 看看这个表达式有什么作用,就知道这里所说的粗略是什么意思了。它匹配了连续多组的八个字符,头尾相连,只有目标文本的最后几个字符除外。

6. 匹配单词边界

        下面我们再试试匹配单词的边界和字母的开始和结束位置:

\bA.{5}T\b

        可以看到细微的差异:

        这个表达式有更强的特指性(请记住特指性,specificity,这个概念很重要),它匹配单词ANCYENT。简写式 \b 匹配单词边界,不消耗任何字符;字符 A 和 T 限定了字符序列的首尾字母;.{5} 匹配任意五个字符;简写式 \b 匹配单词的另一个边界。

        现在再试一下这个简写式:

\b\w{7}\b

        结果如下图所示。

7. 匹配零个或多个字符

        最后再试试匹配零个或多个字符:

.*

        它就相当于 [^\n] 或 [^\n\r]。类似地,点号也可以与表示“一个或多个”的量词(+)连用:

.+

8. 单行模式与多行模式

        单行模式(single line mode)使得通配符点 . 匹配所有字符,包括换行符。多行模式(multi-line mode)使得 ^ 和 $ 匹配到每行字符串的开头和结尾处。从这个定义可以看到,所谓单行模式与多行模式,分别用来限定 . 与 ^ $ 的行为,而不像字面看起来表示单行或多行。因此这两种模式也不是互斥的,可以共用、使用其中一个或都不使用,MySQL中的正则缺省就是都不使用。实际上用 dotall 表示单行模式更为恰当,下一篇演示 dotall 的例子,这里用测试数据说明多行模式。需求是给 T 或 t 开头的行首尾分别加 HTML 标记 <h1> 与 <\h1>。

select regexp_replace(a,'(^T.*$)','<h1>$1<\h1>',1,0,'im') from t_regexp limit 1\G

        结果如下,第一行和第四行加了标签,符合预期。

<h1>THE RIME OF THE ANCYENT MARINERE, IN SEVEN PARTS.<h1>
ARGUMENT.
How a Ship having passed the Line was driven by Storms to the cold Country
<h1>towards the South Pole; and how from thence she made her course to the tropical<h1>
Latitude of the Great Pacific Ocean; and of the strange things that befell;
and in what manner the Ancyent Marinere came back to his own Country.
I.
1       It is an ancyent Marinere,
2          And he stoppeth one of three:
3       "By thy long grey beard and thy glittering eye
4          "Now wherefore stoppest me?

        regexp_replace 函数的参数说明:

  1. a:需要被替换的原字符串字段。
  2. (^T.*$)':正则表达式,匹配 T 开头的行,然后使用括号将文本捕获到一个分组中。
  3. <h1>$1<\h1>:替换表达式,将 $1 捕获的内容嵌套在了 h1 标签中。
  4. 1:开始搜索位置,缺省为1。
  5. 0:替换第几次匹配,缺省为0,表示替换所有匹配。
  6. im:匹配类型,i 表示不区分大小写,m 表示多行匹配模式。如果不加 m,会将整个字符串当做单一字符串,则只能匹配出第一行。

        现在修改需求为给每行首尾分别加 HTML 标记 <h1> 与 <\h1>。

select regexp_replace(a,'(^.*$)','<h1>$1<\h1>',1,0,'im') from t_regexp limit 1\G

        结果如下:

<h1>THE RIME OF THE ANCYENT MARINERE, IN SEVEN PARTS.<h1>
<h1>ARGUMENT.<h1>
<h1>How a Ship having passed the Line was driven by Storms to the cold Country<h1>
<h1>towards the South Pole; and how from thence she made her course to the tropical<h1>
<h1>Latitude of the Great Pacific Ocean; and of the strange things that befell;<h1>
<h1>and in what manner the Ancyent Marinere came back to his own Country.<h1>
<h1>I.<h1>
<h1>1       It is an ancyent Marinere,<h1>
<h1>2          And he stoppeth one of three:<h1>
<h1>3       "By thy long grey beard and thy glittering eye<h1>
<h1>4          "Now wherefore stoppest me?<h1>

        捕获分组中的 ^.*$ 说明:

  • ^ 匹配字符串的第一个字符之前的位置。
  • $ 匹配字符串的最后一个字符后面的位置。
  • . 匹配单个字符。除了换行符之外,它的性质无关紧要。
  • * 匹配前一个匹配零次或多次。

        因此,^.*$ 表示从头到尾匹配任何出现零次或多次的字符。基本上,这意味着匹配从字符串的开头到结尾的所有内容。注意这里的 . 一定要有,否则只会在每行最后添加一对标签:

THE RIME OF THE ANCYENT MARINERE, IN SEVEN PARTS.<h1><h1>
ARGUMENT.<h1><h1>
How a Ship having passed the Line was driven by Storms to the cold Country<h1><h1>
towards the South Pole; and how from thence she made her course to the tropical<h1><h1>
Latitude of the Great Pacific Ocean; and of the strange things that befell;<h1><h1>
and in what manner the Ancyent Marinere came back to his own Country.<h1><h1>
I.<h1><h1>
1       It is an ancyent Marinere,<h1><h1>
2          And he stoppeth one of three:<h1><h1>
3       "By thy long grey beard and thy glittering eye<h1><h1>
4          "Now wherefore stoppest me?<h1><h1>

相关文章:

正则表达式 - 简单模式匹配

目录 一、测试数据 二、简单模式匹配 1. 匹配字面值 2. 匹配数字和非数字字符 3. 匹配单词与非单词字符 4. 匹配空白字符 5. 匹配任意字符 6. 匹配单词边界 7. 匹配零个或多个字符 8. 单行模式与多行模式 一、测试数据 这里所用文本是《学习正则表达式》这本书带的&a…...

银行数字化转型导师坚鹏:银行数字化转型培训方案

目录 一、银行数字化转型培训背景 二、银行数字化转型模型 三、银行数字化转型课程设计思路 四、 银行数字化转型课程基本介绍 五、 银行数字化转型课程设置 六、银行数字化转型课程大纲 七、培训方案实施流程 一、银行数字化转型培训背景 2020年1月3日&#xff…...

多维时序 | MATLAB实现BO-CNN-LSTM贝叶斯优化卷积神经网络-长短期记忆网络多变量时间序列预测

多维时序 | MATLAB实现BO-CNN-LSTM贝叶斯优化卷积神经网络-长短期记忆网络多变量时间序列预测 目录 多维时序 | MATLAB实现BO-CNN-LSTM贝叶斯优化卷积神经网络-长短期记忆网络多变量时间序列预测效果一览基本介绍模型搭建程序设计参考资料 效果一览 基本介绍 MATLAB实现BO-CNN-…...

Shell知识点(一)

1.echo 命令 echo命令的作用是在屏幕输入一行文本&#xff0c;可以降该命令的参数原样输出。 $ echo hello world hello world 如果想要输出的是多行文本&#xff0c;包含换行符&#xff0c;这时就需要把多行文本放在引号里面 $ echo "<HTML><HEAD><TITLE…...

mysql 索引失效、联合索引失效场景和举例

索引失效 假设有一张user 表&#xff0c;表中包含索引 (id); (name); (birthday); (name,age); 对索引字段进行函数操作 select name from user where year(birthday) 2000;使用模糊查询&#xff0c;查询中使用通配符 select name from user where name like %益达%;使用i…...

快速将PDF转换为图片:使用在线转换器的步骤

PDF文件是一种常见的文档格式&#xff0c;但在某些情况下需要将其转换为图片格式&#xff0c;例如将PDF文件插入PPT演示文稿中。此时&#xff0c;使用在线PDF转换器是一种快速且简便的方法。 本文将介绍如何使用在线转换器将PDF文件转换为图片格式。 步骤1&#xff1a;选择合…...

什么是gpt一4-如何用上gpt-4

怎么使用gpt-4 目前GPT-4还未正式发布或公开&#xff0c;因此也没有详细的对接说明。但是我们可以根据GPT-4的前身GPT-3的应用经验&#xff0c;以及GPT-4的预期功能推测一些可能的使用步骤&#xff1a; 选择适合的GPT-4实现技术&#xff1a;GPT-4可能有不同的实现技术&#xff…...

Docker 相关概念

1、Docker是什么&#xff1f; 如何确保应用能够在这些环境中运行和通过质量检测&#xff1f;并且在部署过程中不出现令人头疼的版本、配置问题&#xff0c;也无需重新编写代码和进行故障修复&#xff1f; 答案就是使用容器。Docker之所以发展如此迅速&#xff0c;也是因为它对…...

STM32平衡小车 TB6612电机驱动学习

TB6612FNG简介 单片机引脚的电流一般只有几十个毫安&#xff0c;无法驱动电机&#xff0c;因此一般是通过单片机控制电机驱动芯片进而控制电机。TB6612是比较常用的电机驱动芯片之一。 TB6612FNG可以同时控制两个电机&#xff0c;工作电流1.2A&#xff0c;最大电流3.2A。 VM电…...

动态加载 JS 文件

动态加载JS文件是指在网页运行过程中通过JavaScript代码向页面中动态添加外部JS文件&#xff0c;这种方式能够提高页面加载速度和用户体验&#xff0c;并且可以帮助网站实现更多的功能和特效。 本文将详细介绍动态加载JS文件的基本原理、优势、注意事项以及具体实现方法&#…...

14、lldb调试指令

LLDB LLDB(Low Lever Debug): 默认内置于Xcode中的动态调试工具.标准的lldb提供了一组广泛的命令,旨在与老版本的GDB命令兼容.除了使用标准配置外,还可以很容易地自定义lldb以满足实际需要. 1.1 lldb语法: <command> [<subcommand> [<subcommand>...]] &l…...

浏览器缓存策略:强缓存和协商缓存

浏览器缓存&#xff1a;其实就是在本地使用的计算机中开辟一个内存区&#xff0c;同时也开辟一个硬盘区&#xff0c;作为数据传输的缓冲区&#xff0c;然后利用这个缓冲区来暂时保护用户以前访问的信息通常浏览器的缓存策略分为两种&#xff1a;强缓存和协商缓存&#xff0c;强…...

2023年Chat GPT 应用前景分析

从2022年12月初刚上线至今&#xff0c;不到半年时间ChatGPT月活就超过了1亿用户&#xff01;可谓火的一塌糊涂&#xff0c;比尔盖茨都称&#xff1a;ChatGPT的历史意义重大&#xff0c;不亚于PC或互联网诞生。以至于ChatGPT官网长期都处于满负荷运转的状态&#xff01; 由于Ch…...

并发计算公式

常用并发数计算公式&#xff1a;N[(n0.8SP)/(T0.2)]*R 其中&#xff1a; n为系统用户数&#xff1b; S为每个用户发生的业务笔数&#xff08;QPS&#xff09;&#xff1b; P为每笔业务所需要访问服务器的时间&#xff0c;单位为秒&#xff1b; T为使用业务的时间&#xff0c;单…...

“华为杯”研究生数学建模竞赛2020年-【华为杯】E题:能见度估计与预测(附获奖论文及python代码实现)

​​​​​​​ 目录 摘 要: 一、问题背景与问题重述 1.1 问题背景 1.2 问题重述...

Arduino学习笔记3

一.RGB三色小灯实验 1.源代码 int rgb_R11;//接到板子上面的PWM口11 R int rgb_G9;//接到板子上面的PWM口9 G int rgb_B10;//接到板子上面的PWM口10 B void setup() {pinMode(rgb_R,OUTPUT);//设置rgb_R的控制口为输出模式pinMode(rgb_G,OUTPUT);//设置rgb_G的控制口为输出模…...

BPMN2.0 任务-用户任务

“用户任务(user task)”用于对需要人工执行的任务进行建模。当流程执行到达用户任务时,会为指派至该任务的用户或组的任务列表创建一个新任务。 用户任务用左上角有一个小用户图标的标准任务(圆角矩形)表示。 用户任务在XML中如下定义。其中id是必须属性,name是可选属性…...

David Silver Reinforcement Learning -- Markov process

1 Introduction 这个章节介绍关键的理论概念。 马尔科夫过程的作用&#xff1a; 1&#xff09;马尔科夫过程描述强化学习环境的方法&#xff0c;环境是完全能观测的&#xff1b; 2&#xff09;几乎所有的RL问题可以转换成MDP的形式&#xff1b; 2 Markov Processes 2.1 Mark…...

项目结束倒数2

今天,解决了,多个点的最短路问题 用的dfs,配上了floyed计算出的广源距离 难点是要记录路线,dfs记录路线就很烦 但是好在结束了,经过无数的测试,确保没啥问题(应该把) 来看看我的代码 void dfs(int b[], int x, int* sum, int last, int sums, int a[], BFS& s, Floyd_A…...

VBA智慧办公9——图例控件教程

如图&#xff0c;利用VBA进行可视化交互界面的设计&#xff0c;在界面中我们用到了label&#xff0c;button&#xff0c;text&#xff0c;title等多个工具&#xff0c;在进行框图效果的逐一实现后可进行相应的操作和效果实现。 VBA&#xff08;Visual Basic for Applications&a…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机&#xff0c;因为在使用过程中发现 Airsim 对外部监控相机的描述模糊&#xff0c;而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置&#xff0c;最后在源码示例中找到了&#xff0c;所以感…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...

stm32wle5 lpuart DMA数据不接收

配置波特率9600时&#xff0c;需要使用外部低速晶振...

【Kafka】Kafka从入门到实战:构建高吞吐量分布式消息系统

Kafka从入门到实战:构建高吞吐量分布式消息系统 一、Kafka概述 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,后成为Apache顶级项目。它被设计用于高吞吐量、低延迟的消息处理,能够处理来自多个生产者的海量数据,并将这些数据实时传递给消费者。 Kafka核心特…...

​​企业大模型服务合规指南:深度解析备案与登记制度​​

伴随AI技术的爆炸式发展&#xff0c;尤其是大模型&#xff08;LLM&#xff09;在各行各业的深度应用和整合&#xff0c;企业利用AI技术提升效率、创新服务的步伐不断加快。无论是像DeepSeek这样的前沿技术提供者&#xff0c;还是积极拥抱AI转型的传统企业&#xff0c;在面向公众…...