正则表达式的使用

1、正则表达式-教程

  正则表达式:文本模式,包括普通字符(例如,a到z之间的字母)和特殊字符(称为元字符)。

  正则表达式使用单个字符串来描述,匹配一系列匹配某个句法规则的字符串。

2、正则表达式-语法

  正则表达式描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。正则表达式是由普通字符(例如字符a-z)以及特殊字符(称为“元字符”)组成的文字模式。模式描述在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。

2.1普通字符

  普通字符包括没有显示指定为元字符的所有可打印和不可打印字符。这包括所有大写和小写字符、所有数字、所有标点符号和一些其他符号。

 

2.2 非打印字符

  非打印字符也可以是正则表达式的组成部分。下列列出了表示非打印字符的转义序列:

字符

描述

\cx

匹配由x指明的控制字符。比如\cM匹配一个Control-M或回车符。

x的值必须为A-Z或a-z之一。

\f

匹配一个换页符。=\x0c或=\cL

\n

匹配一个换行符。=\x0a或\cJ

\r

匹配一个回车符。=\x0d和\cM

\s

匹配任何空白字符,包括空格、制表符、换页符等待。=[\f\n\r\t\v]

\S

匹配任何非空白字符。=[^ \f\n\r\t\v]

\t

匹配一个制表符。=\x09和\cl

\v

匹配一个垂直制表符。=\x0b和 \cK

2.3 特殊字符

  特殊字符,就是有一些特殊含义字符。

特别字符

描述

$

匹配输入字符串的结尾位置。如果要匹配本身,需要进行转义,使用\$.

()

标记一个子表达式的开始和结束位置。

*

匹配前面的子表达式0或多次。如果要匹配本身,需要进行转义,使用\*

+

匹配前面的子表达式1或多次。如果要匹配本身,需要进行转义,使用\+

.

匹配除换行符\n之外的任何单个字符。匹配.,使用\.

[

标记一个中括号表达式的开始。要匹配[,使用\[

?

匹配前面的子表达式0或1次,或指明一个非贪婪限定符。要匹配?字符,使用\?

^

匹配输入字符串的开始位置,除非在方括号表达式中使用,当该符号在方括号表达式中使用时,表示不接受该方括号表达式中的字符集合。要匹配^,使用\^

{

标记限定符表达式的开始。要匹配{,使用\{

|

指明两项之间的一个选择。要匹配|,请使用\|


2.4 限定符

  限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有*或+或?或{n}或{n,}或{n,m}共6种。正则表达式中的几种重复模式。

正则表达式的限定符有:

字符(语法)

描述(说明)

*

匹配前面的子表达式0或多次。

+

匹配前面的子表达式1或多次。

匹配前面的子表达式0或1次。

{n}

n是一个非负整数。匹配确定的n次。

{n,}

n是一个非负整数,至少匹配n次。

{n,m}

m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。

*、+限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有它们的后面加上一个?就可以实现非贪婪或最小匹配。

贪婪:下面的表达式匹配从开始小于符号(<)到关闭大于符号(>)之间的所有内容。

比如:<h1>RUNOOB-菜鸟教程</h1>

/<.*>/ 

非贪婪:如果您只需要匹配开始和结束h1标签,下面的非贪婪表达式只匹配<h1>。

/<.*?>/ 

2.5定位符

定位符能使正则表达式固定到行首或行尾。定位符用来描述字符串或单词的边界,^和$分别指字符串的开始与结束,\b描述单词的前或后边界,\B表示非单词边界。

字符

描述

^

匹配输入字符串开始的位置。

$

匹配输入字符串结尾的位置。

\b

匹配一个单词边界,即字与空格间的位置。

\B

非单词边界匹配。比如chapter和aptitude,apt出现在单词chapter中的非单词边界处,但出现在单词aptitude中的单词边界处。

注意:不能将限定符与定位符一起使用。由于在紧靠换行或单词边界的前面或后面不能有一个以上位置,因为不允许诸如^*之类的表达式。

选择:用圆括号将所有选择项括起来,相邻的选择项之间用|分隔。但用圆括号会有一个副作用,使相关的匹配会被缓存,此时可用?:放在第一个选项前来消除这种副作用。

其中?:是非捕获元之一,还有两个非捕获元是?=和?!。

?=:正向预查,在任何开始匹配圆括号内的正则表达式的位置来匹配搜索字符串。

?!:负向预查,在任何开始不匹配该正则表达式模式的位置来匹配搜索字符串。

反向引用:对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到一个临时缓冲区中,所捕获的每个子匹配都按照在正则表达式中从左到右出现的顺序存储。缓冲区编号从1开始,最多可存储99个捕获的子表达式。

可以使用非捕获元字符?:,?=;?!来重写捕获,忽略对相关匹配的保存。

比如例子1:Is is the cost of of gasoline going up up?

该正则表达式:/\b([a-z]+) \1\b/ig   #[a-z]+ 表示1个或多个字母。\1指定第一个子匹配项。g表示全局变量,i忽略大小写。

例子2:要匹配taobao taobao ,home home这样的情况如何处理?

正则表达式:\b(\w+)\b\s+\1\b

正则表达式给匹配项命名:\b(?<Word>\w+)\b\s+\k<Word>\b

                

 

3、正则表达式-元字符

字符

描述

\

将下一个字符标记为特殊字符、或原义字符、或向后引用、或八进制转义符。例如n 匹配字符n,\n匹配换行符。匹配\,使用\\;匹配(,使用\(

^

匹配输入字符串的开始位置,除非在方括号表达式中使用,当该符号在方括号表达式中使用时,表示不接受该方括号表达式中的字符集合。要匹配^,使用\^

$

匹配输入字符串的结尾位置。如果要匹配本身,需要进行转义,使用\$.

*

匹配前面的子表达式0或多次。

+

匹配前面的子表达式1或多次。如果要匹配本身,需要进行转义,使用\+

匹配前面的子表达式0或1次,或指明一个非贪婪限定符。要匹配?字符,使用\?

{n}

n是一个非负整数。匹配确定的n次。

{n,}

n是一个非负整数,至少匹配n次。

当该字符紧跟在任何一个其他限制符(*、+、?、{n}、{n,}、{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如对于字符串"oooo",'0+?'将匹配单个"o","o+"将匹配所有'o'.

.

匹配除换行符\n之外的任何单个字符。匹配.,使用\.

(pattern)

匹配pattern并获取这一匹配。

(?:pattern)

匹配pattern但不获取这一匹配,即这是一个非获取匹配,不进行存储供以后使用。比如'industr(?:y|ies)就是一个比'industry|industries'更简单的表达式。

(?=pattern)

正向肯定预查(look ahead positive assert),在任何匹配pattern的字符串开始处匹配查找字符串。非获取匹配,该匹配不需要获取供以后使用。比如“windows(?=95|98|NT|2000)”能匹配windows2000中的windows,但不能匹配windows3.1中的windows.预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。

(?!pattern)

正向否定预查(negative assert),在任何不匹配pattern的字符串开始处匹配查找字符串。非获取匹配,也就是说,该匹配不需要获取供以后使用。比如“windows(?!95|98|NT|2000)”不能匹配windows2000中的windows,但能匹配windows3.1中的windows.预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。

(?<=pattern)

反向(look behind)肯定预查,与正向肯定预查方向相反。比如“(?<=95|98|NT|2000)windows”能匹配2000windows中的windows,但不能匹配3.1windows中的windows.

(?<!parttern)

反向(look behind)否定预查,与正向否定预查方向相反。比如“(?<!95|98|NT|2000)windows”不能匹配2000windows中的windows,但能匹配3.1windows中的windows.

x|y

匹配x或y。比如,'z|food'能匹配'z'或'food'。‘(z|f)ood’则匹配"zood"或"food".

[xyz]

字符集合。匹配所包含的任意一个字符。比如'[abc]'可以匹配'plain'中的'a'.

[^xyz]

负值字符集合。匹配未包含的任意字符,例如'[^abc]'可以匹配’plain'中的‘p’、'l'、'i'、'n'.

[a-z]

字符范围。匹配指定范围内的任意字符。例如'[a-z]'可以匹配'a'到'z'范围内的任意小写字母字符。

[^a-z}

负值字符范围。匹配任何不在指定范围内的任意字符。例如'[^a-z]'可以匹配任何不在'a'到'z'范围内的任意小写字符。

\b

匹配一个单词边界,即字与空格间的位置。例如,'er\b'可以匹配"never"中的"er",但不能匹配"verb"中的"er"

\B

匹配非单词边界。例如,'er\B'不可以匹配"never"中的"er",但能匹配"verb"中的"er"

\cx

匹配由x指明的控制字符。比如\cM匹配一个Control-M或回车符。x的值必须为A-Z或a-z之一。

\d

匹配一个数字字符。等价于[0-9]

\D

匹配一个非数字字符。等价于[^0-9]

\f

匹配一个换页符。等价于\x0c和=\cL

\n

匹配一个换行符。等价于\x0a或\cJ

\r

匹配一个回车符。等价于\x0d和\cM

\s

匹配任何空白字符,包括空格、制表符、换页符等待。=[\f\n\r\t\v]

\S

匹配任何非空白字符。=[^ \f\n\r\t\v]

\t

匹配一个制表符。=\x09和\cl

\v

匹配一个垂直制表符。=\x0b和 \cK

\w

匹配字母、数字、下划线。等价于[A-Za-z0-9_]

\W

匹配非字母、数字、下划线。等价于[^A-Za-z0-9_]

\xn

匹配n,其中n为十六进制转义值。例如'\x41'匹配“A”。'\x041'则等价于‘\x04' & '1'.

\num

匹配num.

\n

标识一个八进制转义值或一个向后引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为向后引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。

\nm

标识一个八进制转义值或一个向后引用。如果 \nm 之前至少有 nm 个获得子表达式,则 nm 为向后引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。

\nml

如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。

\un

匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, \u00A9 匹配版权符号 (?)。

其中零宽断言:

?=exp 零宽度正预测先行断言,自身出现的位置的后面能匹配表达式exp。

比如:I’m singing while you’re dancing.

正则表达式:\b\w+(?=ing\b)

?<=exp 零宽度正向顾后发断言,自身出现的位置的前面能匹配表达式exp.

比如:reading a book

正则表达式:(?<=\bre)\w+\b

负向零宽断言:

查找这样的单词--它里面出现了字母q,但是q后面跟的不是字母u。

正则表达式:\b\w*q[^u]\w*\b,存在一个问题,[^u]占位的问题。

?!=exp 负向零宽断言:\b\w*q(?!u)\w*\b 并不消费任何字符

\d{3}(?!\d)匹配3位数字,而且这3位数字的后面不能是数字。

\b((?!abc)\w)+\b匹配不包含连续字符串abc的单词。

?<! 零宽度负回顾后发断言。

(?<![a-z])\d{7} 匹配前面不是小写字母的七位数字。

4、正则表达式-运算符优先级

正则表达式从左到右进行计算,并遵循优先级顺序,与算数表达式类似。

相同优先级的从左到右进行计算,不同优先级的运算先高后低。

运算符

描述

\

转义符

(),(?:),(?=),[]

圆括号和方括号

*,+,?,{n},{n,},{n,m}

限定符

^,$,\任意元字符,任意字符

定点位和序列(即:位置和顺序)

|

替换,“或”操作,字符具有高于替换运算符的优先级,使得"m|food"匹配"m"或"food"。如要匹配"mood"或"food",请使用括号创建子表达式,从而产生"(m|f)ood"

5、正则表达式-匹配规则

5.1 基本模式匹配

模式:正则表达式最基本的元素,它们是一组描述字符串特征的字符。比如:

^once 包含了特殊字符^,表示开头,表示该模式只匹配以once开头的字符串。匹配”once upon a time”,不匹配”There once was a man from NewYork”.

bucket$ ,$符号用来匹配那些以给定模式结尾的字符串。匹配”who kept all of this cash in a bucket”,不匹配buckets.

^bucket$ 同时使用^和$,表示精确匹配.

5.2 字符簇

字符簇:描述我们要的模式的方法。要建立一个表示所有元音字符的字符簇,就把所有的元音字符放在一个方括号里:[AaEeIiOoUu].

[a-z] //匹配所有的小写字母

[A-Z] //匹配所有的大写字母

[a-zA-Z]   //匹配所有的字母

[0-9] ==\d //匹配所有的数字

[a-z0-9A-Z_]==\w  //匹配所有的字母、数字、下划线

[0-9\.\-]   //匹配所有的数字,句号和减号

[ \f\r\t\n]   //匹配所有的白字符

6 正则表达式-示例

6.1 简单表达式

正则表达式最简单形式实在搜索字符串中匹配其本身的单个普通字符。例如,单字符模式,同事也可以将血多单字符组合起来以形成大的表达式。(不需要串联运算符,只需要在一个字符后面键入另一个字符)

/a/

/7/

/M/

/a7M/

6.2 字符匹配

句点(.)匹配字符串中的各种打印或非打印字符,只有一个字符例外(换行符\n)。比如aac、abc、acc、adc、a1c、a2c、a-c、a#c。

/a.c/

6.3 中括号表达式

若要创建匹配字符组的一个列表,请在方括号([和])内放置一个或更多单个字符。当字符括在中括号内时,该列表称为”中括号表达式”。

比如Chapter1、Chapter2、Chapter3、Chapter4、Chapter5。

如上用正则表达式为:/Chapter [12345]/   或者/Chapter [1-5]/

6.4 替换和分组

替换使用|字符来语序在两个或多个替换选项之间进行选择。例如,可以扩展章节标题正则表达式,以返回比章节标题更广的匹配项。

比如:/^Chapter|Section [1-9][0-9]{0,1}$/

该表达式要么匹配行首的Chapter,要么匹配行尾的单词Section及跟在其后的任何数字。

比如:/^(Chapter|Section) [1-9][0-9]{0,1}$/

该表达式周围的括号捕获两个匹配字中的任一个供以后使用。

分组将子表达式进行做成子集,使用()进行分组,方便对match的字符串进行划分。

 

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

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

相关文章

《论文阅读13》Efficient Urban-scale Point Clouds Segmentationwith BEV Projection

一、论文 研究领域&#xff1a; 城市级3D语义分割论文&#xff1a;Efficient Urban-scale Point Clouds Segmentationwith BEV Projection清华大学&#xff0c;新疆大学2021.9.19论文github论文链接 二、论文概要 2.1主要思路 提出了城市级3D语义分割新的方法&#xff0c;将…

1.SpringMVC接收请求参数及数据回显:前端url地址栏传递参数通过转发显示在网页

1、SpringMVC 处理前端提交的数据 1.1 提交的域名和处理方法的参数不一致&#xff0c;使用注解解决 1.2 提交的域名和处理方法的参数不一致&#xff0c;使用注解解决 1.3 提交的是一个对象 2、前端url地址栏传递的是一个参数 请求地址url&#xff1a;http://localhost:8080/s…

测试开发工程师到底是做什么的?

一二三线互联网公司对测试开发工程师的要求&#xff1a; 现在很多测试的同事对测试开发工程师的认识都有一定的误差。 我最早在阿里的时候和测试开发工程师沟通的时候&#xff0c;发现阿里的测试开发工程师&#xff0c;他们基本上都分为两种&#xff0c;一种是业务类型的&…

Python基础教程: json序列化详细用法介绍

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 Python内置的json模块提供了非常完善的对象到JSON格式的转换。 废话不多说&#xff0c;我们先看看如何把Python对象变成一个JSON&#xff1a; d dict(nameKaven, age17, sexMale) print(json.dumps(d)) # {"na…

【Linux】环境变量

目录 一、环境变量的概念二、 常见的环境变量1.查看环境变量的方法2.PATH3.HOME4.SHELL 三、环境变量的相关指令四、命令行参数 一、环境变量的概念 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数 如&#xff1a;我们在编写C/C代码的…

Prometheus技术文档-基本使用-配置文件全解!!!!!

简介&#xff1a; Prometheus是一个开源的系统监控和告警系统&#xff0c;由Google的BorgMon监控系统发展而来。它主要用于监控和度量各种时间序列数据&#xff0c;比如系统性能、网络延迟、应用程序错误等。Prometheus通过采集监控数据并存储在时间序列数据库中&#xff0c;…

【视频】使用OBS将MP4推流至腾讯云直播

1、下载OBS OBS官网:https://obsproject.com/ OBS支持Win、Mac、Linux,如果下载速度很慢,建议使用迅雷下载 2、OBS推流设置 2.1 添加场景 默认会有一个“场景”,如果想继续添加可以点击“+”按钮 2.2 添加媒体源 1)点击“来源”窗口中“+”按钮 2)支持的媒体源如…

安装Tomac服务器——安装步骤以及易出现问题的解决方法

文章目录 前言 一、下载Tomcat及解压 1、选择下载版本&#xff08;本文选择tomcat 8版本为例&#xff09; 2、解压安装包 二、配置环境 1、在电脑搜索栏里面搜索环境变量即可 2、点击高级系统设置->环境变量->新建系统变量 1) 新建系统变量&#xff0c;变量名为…

【学会动态规划】最大子数组和(19)

目录 动态规划怎么学&#xff1f; 1. 题目解析 2. 算法原理 1. 状态表示 2. 状态转移方程 3. 初始化 4. 填表顺序 5. 返回值 3. 代码编写 写在最后&#xff1a; 动态规划怎么学&#xff1f; 学习一个算法没有捷径&#xff0c;更何况是学习动态规划&#xff0c; 跟我…

Linux:Shell编辑之文本处理器(sed)

目录 绪论 1、sed的原理&#xff1a;读取 执行 显示 三个过程 2、sed 文本内容处理工具&#xff0c;文件过大怎么办&#xff1f; 3、sed的操作选项 3.1 常用选项 3.2 操作符 3.3 行号的范围打印 3.4 对包含指定字符串的内容进行打印 3.5 删 3.5.1 正则表达式删除 3.6…

深入浅出 栈和队列(附加循环队列、双端队列)

栈和队列 一、栈 概念与特性二、Stack 集合类及模拟实现1、Java集合中的 Stack2、Stack 模拟实现 三、栈、虚拟机栈、栈帧有什么区别&#xff1f;四、队列 概念与特性五、Queue集合类及模拟实现1、Queue的底层结构&#xff08;1&#xff09;顺序结构&#xff08;2&#xff09;链…

Golang-使用 gvm 进行版本控制

当你想为每个项目切换 go 版本时&#xff0c;gvm (Go Version Manager) 很方便。 这里&#xff0c;我将介绍“如何在Mac上安装gvm”和“如何使用gvm” 使用准备 仅适用于 Mac 的准备工作 按照MacOSX 要求中的说明执行以下命令。 xcode-select --install brew update brew …

C++(Qt)软件调试---将调试工具安装到AeDebug(11)

C(Qt)软件调试—将调试工具安装到AeDebug&#xff08;11&#xff09; 文章目录 C(Qt)软件调试---将调试工具安装到AeDebug&#xff08;11&#xff09;1、前言1.1 使用的调试工具 2、调试器安装1.1 WinDbg1.2 procdump1.3 DrMinGW1.4 vsjitdebugger 更多精彩内容&#x1f449;个…

深入了解Linux运维的重要性与最佳实践

Linux作为开源操作系统的代表&#xff0c;在企业级环境中的应用越来越广泛。而在保障Linux系统的正常运行和管理方面&#xff0c;Linux运维显得尤为关键。本文将介绍Linux运维的重要性以及一些最佳实践&#xff0c;帮助读者更好地了解和掌握Linux系统的运维技巧。 首先&#xf…

OPENCV C++(十)gramm矫正+直方图均衡化

两者都是只对单通道使用&#xff0c;对多通道的话 就需要分离通道处理再合并通道 两种方法&#xff0c;第一个要运算次数太多了&#xff0c;第二个只需要查表 伽马矫正函数&#xff0c;这里用第二种方法&#xff0c;且写法有点高级 int gammaCorrection(cv::Mat srcMat, cv::…

Java【Spring】使用注解, 更简单的存储和获取 Bean

文章目录 前言一、存储 Bean1, 配置文件2, 五大类注解Bean 的命名规则 3, 方法注解Bean 的命名规则 二、获取 Bean1, 属性注入2, Setter 注入3, 构造方法注入4, Autowired 和 Resource 的区别5, 同一个类型的多个 Bean 注入问题 总结 前言 各位读者好, 我是小陈, 这是我的个人主…

【网络基础实战之路】实现RIP协议与OSPF协议间路由交流的实战详解

系列文章传送门&#xff1a; 【网络基础实战之路】设计网络划分的实战详解 【网络基础实战之路】一文弄懂TCP的三次握手与四次断开 【网络基础实战之路】基于MGRE多点协议的实战详解 【网络基础实战之路】基于OSPF协议建立两个MGRE网络的实验详解 PS&#xff1a;本要求基于…

FreeRTOS(任务通知)

资料来源于硬件家园&#xff1a;资料汇总 - FreeRTOS实时操作系统课程(多任务管理) 目录 一、任务通知的概念 1、概念 2、发送通知给任务的方式 3、任务通知使用限制 二、任务通知的运行机制 三、任务通知的API函数 1、任务通知的数据结构 2、常用的API函数 3、函数x…

opencv实战项目 手势识别-实现尺寸缩放效果

手势识别系列文章目录 手势识别是一种人机交互技术&#xff0c;通过识别人的手势动作&#xff0c;从而实现对计算机、智能手机、智能电视等设备的操作和控制。 1. opencv实现手部追踪&#xff08;定位手部关键点&#xff09; 2.opencv实战项目 实现手势跟踪并返回位置信息&…

基于低代码和数字孪生技术的电力运维平台设计

电力能源服务商在为用能企业提供线上服务的时候&#xff0c;不可避免要面对用能企业的各种个性化需求。如果这些需求和想法都要靠平台厂家研发人员来实现&#xff0c;那在周期、成本、效果上都将是无法满足服务运营需要的&#xff0c;这也是目前很多线上能源云平台应用效果不理…