正则表达式学习和高级用法

以下所有的验证都在
在线验证

1. 起始符 /

正则表达式的起始符

2. 限定符

   +

匹配前面的子表达式**1次或多次**。例如,zo+ 能匹配 "zo" 以及"zoo",但不能匹配 "z"+等价于 {1,}

   ?

匹配前面的子表达式**0次或1次**。例如,do(es)? 可以匹配 "do""does""doxy" 中的 "do""does"
? 等价于 {0,1}

  *

匹配前面的子表达式**0次或多次**。例如,zo* 能匹配 "z" 以及"zoo"* 等价于 {0,}

  . 句点符

匹配除换行符外 /r/n的所有字符,但一次只能匹配一个

   { }

     {n}

n 是一个非负整数。匹配确定的 n 次。例如,o{2} 不能匹配 "Bob" 中的 o,但是能匹配 "food" 中的两个 o

     {n,}

n 是一个非负整数。至少匹配n 次。例如,o{2,} 不能匹配 "Bob" 中的 o,但能匹配 "foooood" 中的所有 oo{1,} 等价于 o+o{0,} 则等价于 o*

    {n,m}

mn 均为非负整数,其中 n <= m。最少匹配 n 次且最多匹配 m 次。例如,o{1,3} 将匹配 "fooooood" 中的前三个 oo{0,1} 等价于 o?。请注意在逗号和两个数之间不能有空格。

3. 普通字符

   [ ]

所有的区间都会匹配一个结果返回
在这里插入图片描述

   [ABC]

匹配包含在中括号中的所有字符,注意的是匹配的的字符不需要是连续的的,只要是在 [...]中的字符就行,相当于字典。
在这里插入图片描述

   [^ABC ]

和[ABC] 是取反的操作,表示不包含的匹配
在这里插入图片描述

   区间操作 [A-Za-z0-0]

匹配某一区间的所有包含字符 例如匹配所有的中文[\u4e00-\u9fa5] ,这里是通过Unicode
在这里插入图片描述

4. 元字符

  \d \D

配置所有的数字字符, 大写的表示取反 0-9

  \w \W

匹配所有的 英文字母 + 数字 + 下划线, 只能匹配一个,如果要匹配多个需要用到 \w+
在这里插入图片描述

  \s \S

匹配任何空白字符,包括空格、制表符、换页符等等。

5. 逻辑运算符

   与运算 (...)

括号内的做为一个整体匹配

  或运算符 |

指明两项之间的一个选择。要匹配 |,请使用 \|
A(ab|cd)D 两个匹配一个
在这里插入图片描述

6. 定位符

   $ 字符串结尾符

表示匹配的所有字符在句尾

  ^ 首字符匹配

在中括号中[ ] 表示取反

  \b \B 边界匹配符

将两个空个之间的字符整体作为一个单词, 匹配边界包含某一特征的字符
在这里插入图片描述

7. 高级用法

   贪婪匹配 or 懒惰匹配 ?

正则匹配的原则默认是按照贪婪匹配,表示尽可能多的匹配,也就是在满足条件的情况下,找到最长的。

<span> <div>this is very important!</div> </span>

我们要匹配所有的html标签 我们用 <.+> ,结果发现匹配的并不是 按照 <span><div>
而是把所有的都返回了,原因就是默认采用了贪婪匹配。
在这里插入图片描述
如果我们用<.+?>表示我们用懒惰匹配,只要找到符合的就作为一个返回结果。
在这里插入图片描述
懒惰模式存在时对可匹配多个字符的操作符 例如

贪婪元字符懒惰元字符
++?
**?
{}{}?

   修饰符

      /i

ignore - 不区分大小写	将匹配设置为不区分大小写,搜索时不区分大小写: A 和 a 没有区别。

     /g

g	global - 全局匹配	查找所有的匹配项。

     /m

m	multi line - 多行匹配	使边界字符 ^ 和 $ 匹配每一行的开头和结尾,记住是多行,而不是整个字符串的开头和结尾。

     /s

特殊字符圆点. 中包含换行符 \n, 默认情况下的圆点 . 是匹配除换行符 \n 之外的任何字符,加上 s 修饰符之后, 
. 中包含换行符 \n。

在这里插入图片描述

   回溯引用

回溯引用指的是模式的后半部分引用在前半部分中定义的子表达式,且只能用来引用模式里的子表达式()子表达式即用元字符()括起来的部分)。简单理解,可以将回溯引用想象成对变量的引用。

    使用

\1表示引用第1个子表达式,\2表示引用第2个子表达式,以此类推(通常,回溯引用从1开始匹配)

    注意

由于子表达式是按照其在表达式中的相对位置来引用的,因此有个不好之处在于,一旦改变了子表达式的相对位置,很容易引起正则的回溯引用失效。
例子:
我们要匹配一个HTML标签 <h1>-<h6> 中的内容,我们用这样的正则<[Hh][1-6]>.*?</[Hh][1-6]>,这个可以匹配但是没有办法判断标签错误匹配的问题。
在这里插入图片描述
可以用回溯解决,主要时判断<h>标签前面的数字是否匹配, <[hH]([1-6])>.*?</[hH]\1>就可以解决。

   替换操作符 $

$1$2表达的是正则表达式中小括号(即分组)中的内容,$1是第一个小括号(分组)中的匹配结果,$2是第二个小括号(分组)中的匹配结果,以此类推。通常$1$2用在替换操作中。如下:
在这里插入图片描述

  前后查找

前后查找是查找具有某一条件的字符串

    (正)向前查找 (?=)

如果我们想在一堆 URL 中拿到它们的协议名(scheme)

http://www.test.com
https://www.example.com
ftp://ftp.aaa.com

我们可能会使用.+: 来完成要求,但是该模式匹配的是 http:,https:,ftp:,要提取协议名我们还得对字符串做二次处理。所幸的是,使用向前查找.+(?=:) 就能够省去后面的冒号,其中子表达式(?=:) 表示找到: 就可以了,不把它包括在最终的匹配结果里。

    (正)向后查找 (?<=)

除了?= 表示向前查找,还有很多正则表达式(JS不在其中。。。)也支持向后查找,操作符为 ?<=。同样地,来看一个例子:对于如下文本

ABC01: $23.45
HGG43: $5.31

如果我们想将其中的价格匹配出来(不含$),使用 [0-9.]+ 是不行的,因为它也会匹配出 0143,这时候使用向后查找 (?<=\$)[0-9.]+ 问题就迎刃而解了。

  前后取非查找 (负向查找) (?!) (?<!)

如果文本中我们只想匹配数量而不匹配金额:只匹配num 不匹配 $num,比如下面这个例子

I paid $30 for 100 apples,
50 orange, and 60 pears,
I saved $5 on this order.

\b(?<!\$)\d+\b 最终的匹配的结果是只包含那些不以 $ 开头的数值。
这个是所有操作符的总结
这时候可以取非

操作符说明
(?=)正向前查找
(?<=)正向前查找
(?!)负向前查找
(?<!)负向后查找

  嵌入条件

北美的电话号码格式是 (123)456-7890123-456-7890,要匹配该模式,可能很容易就想到使用 \(?\d{3}\)?-?\d{3}-\d{4},但是该表达式也会匹配到非法的数据格式比如 (123-456-7890,这种情况我们就需要使用条件:如果电话号码里有一个 (,则第五个字符匹配 ),否则匹配 -
嵌入条件的语法为:

(?(backreference)true-regex)
(?(backreference)true-regex|false-regex)

可以理解为:

if (backreference) { true-regex } else { false-regex }

分析这个模式,其中 (\()? 匹配一个可选的左括号,(?(1)\)|-) 是一个回溯引用条件,只有配对出现的括号才会被匹配。

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

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

相关文章

Java基础入门·对存储文件File的相关操作

前言 File类获取的方法 getName() | getPath() File getAbsoluteFile() | File getParentFile() long length() File类遍历方法 IO流对象的分类 1.按照操作的文件类型分类 2.按照数据的流向分类 IO流对象的分类归纳 OutputStream 字节输出流写入文件的步骤 追加写入 F…

AUTOSAR汽车电子嵌入式编程精讲300篇-车载CAN总线网络的异常检测

目录 前言 国内外研究现状 CAN 总线异常检测存在的问题 车载网络信息安全问题分析

电路中VCC VDD VSS VEE GND的含义

在电路中&#xff0c;芯片引脚经常会出现VCC&#xff0c;VDD&#xff0c;VSS&#xff0c;VEE和GND这些标示。 其中VCC一般表示通用芯片的电源引脚&#xff0c;比如一些模拟运放的正电源引脚&#xff0c;74系列数字芯片的电源引脚&#xff0c;VCC一般接相应的正电源电压。 VDD一…

php7.4编译安装,及重要的拓展库

1、下载tar文件 wget https://www.php.net/distributions/php-7.4.16.tar.gz2、解压php7.4 并进入php7.4文件夹 3、重点编译安装&#xff0c;编译完整的配置并安装 ./configure --prefix/usr/local/php --enable-fpm \ --disable-debug \ --disable-iconv \ --disable-rpa…

若依注解学习(一)@Log

Log 涉及到&#xff1a; Log&#xff0c;LogAspect&#xff0c;SecurityUtils&#xff0c;SysUser&#xff0c;SysOperLog&#xff0c;BusinessStatus&#xff0c;StringUtils&#xff0c;ServletUtils AsyncManager&#xff0c;AsyncFactory&#xff…

Mock数据:单元测试中的心灵鸡汤

在当今的软件开发领域&#xff0c;质量控制已经成为了一个不可或缺的环节。为了确保软件的稳定性和可靠性&#xff0c;开发者们投入了大量的时间和精力进行各种测试。其中&#xff0c;单元测试作为最基础的测试方法&#xff0c;其重要性不言而喻。然而&#xff0c;单元测试中的…

用于视觉检测的线扫远心镜头VS-LTC系列

VS-LTC 系列线扫远心镜头&#xff0c;近期已经新增 3.5倍及5倍型号 &#xff0c;支持大靶面芯片相机&#xff1b;适用于半导体&#xff0c;基板以及 Mini LED等行业的视觉检测。 在机器视觉产品资料查询平台&#xff0c;了解更多VS-LTC工业镜头的信息。 大靶面线扫远心镜头 …

ArrayBlockingQueue 带有三个参数的构造函数为何需要加锁?

哪一个构造函数 public ArrayBlockingQueue(int capacity, boolean fair,Collection<? extends E> c) {this(capacity, fair);final ReentrantLock lock = this.lock;lock.lock(); // Lock only for visibility, not mutual exclusiontry {final Object[] items = this…

swift 页面跳转

segue 故事板的屏幕之间导航 设置全局变量 退回操作 Optionals ??

vue项目打包_以生产环境prod模式打包_vue-cli-service 不是内部或外部命令,也不是可运行的程序---vue工作笔记0025

打开命令行: 首先执行npm install 不执行会报错: npm run build:prod --scripts-prepend-node-pathauto 然后再这样执行就是以生产环境模式打包了.

【React + Ant Design】表单如何在前置项未填写时禁止后置项交互并提示

在 react antd 中&#xff0c;对表单做在前置项未填写时禁用后置项交互并提示的效果。 情景 最近有这么个需求&#xff0c;某个业务中&#xff0c;要填写一张表单&#xff0c;其中有这样两项&#xff1a;选择数据连接和选择数据表&#xff0c;数据表是数据连接下所拥有的表。…

lv5 嵌入式开发-2 exec函数族

目录 1 进程 – exec函数族 1.1 exec函数族特点 1.2 进程 – execl / execlp使用方法 1.3 进程 – execv / execvp 2 进程 – system 3 exec族要点演示 掌握&#xff1a;exec函数族、system 1 进程 – exec函数族 执行程序&#xff0c;通孔ps -elf发现&#xff0c;父进…

【数据结构】二叉树链式结构的实现(三)

目录 一&#xff0c;二叉树的链式结构 二&#xff0c;二叉链的接口实现 1&#xff0c;二叉链的创建 2&#xff0c;接口函数 3&#xff0c;动态创立新结点 4&#xff0c;创建二叉树 5&#xff0c;前序遍历 6&#xff0c;中序遍历 7&#xff0c;后序遍历 三&#xff0c;结点个…

【Python】自动化办公之路:word自动化实战宝典!

文章目录 前言一、环境安装二、使用步骤1.引入库2.读入数据 Python-docx 编辑已存在文档win32com 将 doc 转为 docxwin32com 操作 word总结 前言 使用Python操作word大部分情况都是写操作&#xff0c;也有少许情况会用到读操作&#xff0c;在本次教程中都会进行讲解&#xff0…

Git(6)——GitHub

目录 一、简介 二、概要 三、注册 ​四、创建仓库 五、推送本地代码 六、拉取远端代码 一、简介 在Git&#xff08;5&#xff09;中&#xff0c;我们已经对Git分支的概念和用法有了一定了解&#xff0c;对于在本地进行代码版本管理&#xff0c;其实当前所学的东西基本已经…

C语言生成随机数、C++11按分布生成随机数学习

C语言生成随机数 如果只要产生随机数而不需要设定范围的话&#xff0c;只要用rand()就可以&#xff1b;rand()会返回一随机数值, 范围在0至RAND_MAX 间&#xff1b;RAND_MAX定义在stdlib.h, 其值为2147483647&#xff1b; 如果想要获取在一定范围内的数的话&#xff0c;直接做…

关于header in Cpp

ctype.h是一个header in Cpp, 什么是header&#xff1f; 在C中&#xff0c;头文件&#xff08;header file&#xff09;是一种用于包含预定义函数、变量和声明的文件。头文件通常具有.h扩展名&#xff0c;并包含了用于在C程序中使用的函数原型、常量定义、类声明等信息。头文…

Golang笔试题:编写一个函数,接收一个整数参数n,输出n的阶乘结果

今天&#xff0c;我们开发的AI笔试题工具&#xff0c;ai扁食——AI程序员笔试系统给我出了中级Golang题目&#xff0c;就是这道题&#xff1a;《请编写一个函数&#xff0c;接收一个整数参数n&#xff0c;输出n的阶乘结果》&#xff0c;希望我写一个函数&#xff0c;输出n的阶乘…

华为云HECS安装docker并安装mysql

1、运行安装指令 yum install docker都选择y&#xff0c;直到安装成功 2、查看是否安装成功 运行版本查看指令&#xff0c;显示docker版本&#xff0c;证明安装成功 docker --version 3、启用并运行docker 3.1启用docker指令 systemctl enable docker 3.2 运行docker指令…

AI绘图提示词Stable Diffusion Prompt 笔记

基础 提示词分为正向提示词&#xff08;positive prompt&#xff09;和反向提示词&#xff08;negative prompt&#xff09;&#xff0c;用来告诉AI哪些需要&#xff0c;哪些不需要词缀的权重默认值都是1&#xff0c;从左到右依次减弱&#xff0c;权重会影响画面生成结果。AI …