通俗易懂的正则表达式

news2024/11/14 12:45:38

正则表达式的英文是regular expression简称regex。正则表达式就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,并让计算机用这个规则去检索符合规则的文本。

创建正则表达式
1、利用RegExp new RegExp(‘expression’)
2、双反斜杠 / expression /

属性解释:
1、g 匹配全局
2、 i 忽略大小写

元字符:元字符是正则表达式中的特殊字符,用于定义某种特定的匹配模式

元字符含义
.匹配任意单个字符(除换行符)
*匹配前面的字符零次或多次
+匹配前面的字符一次或多次
?匹配前面的字符零次或一次
^匹配字符串的开头
$匹配字符串的结尾
[]匹配括号内的任意字符(字符集)
()分组,括号内的内容作为一个整体匹配
\转义符,表示将元字符转换为普通字符

量词: 量词用于控制匹配的次数,指定某个模式出现的次数范围

量词含义
.匹配任意单个字符(除换行符)
*匹配前面的字符零次或多次
+匹配前面的字符一次或多次
{n}匹配前面的模式正好 n 次
{n,}匹配前面的模式至少 n 次
{n,m}匹配前面的模式至少 n 次,至多 m 次

. 的用法

表示可以匹配任意一个字符

var reg = /a.b/
console.log(reg.test("abbb"))  // true
console.log(reg.test("ahbb"))  // true
console.log(reg.test("aahb"))  // true
console.log(reg.test("ahb"))   // true
console.log(reg.test("ahhb"))  // true

*的用法

表示*前面的字符匹配0次或多次

var regs = /a*b/
console.log(regs.test("aaaab"))      // true
console.log(regs.test("ab"))         // true
console.log(regs.test("arrrb"))      // true
console.log(regs.test("grrrb"))      // true
console.log(regs.test("grrrbfff"))   // true
console.log(regs.test("grrrt"))      // false
console.log(regs.test("grrrtb"))     // true
// 正则表达式中只有有其中一段字符串满足就可以 以上表达式代表只要a字符出现多次或0次都可以  所以只要有b就可以

+的用法

表示前面的字符匹配1次或多次

var reg1 = /ab+c/
console.log(reg1.test('abbc1111111111'))  //true
console.log(reg1.test('abec1111111111'))  //false
console.log(reg1.test('abbchhh'))         //true

?的用法

表示前面的字符出现0次或1次

var reg2 = /a?b/
console.log(reg2.test('b'))       //true
console.log(reg2.test('aab'))     //false
console.log(reg2.test('aaggg'))   //false
console.log(reg2.test('aaab'))    //false
console.log(reg2.test('ab'))      //true
console.log(reg2.test('haab'))    //true
console.log(reg2.test('ahab'))    //true

{n} 的用法

表示匹配前面字符正好n次

var reg3 = /a{3}b/
console.log(reg3.test("ab"))     // false
console.log(reg3.test("aab"))    // false
console.log(reg3.test("aaab"))   // true
console.log(reg3.test("aaaab"))  // true
console.log(reg3.test("haaab"))  // true
console.log(reg3.test("haaac"))  // false

{n,} 的用法

表示匹配前面字符至少n次

var reg4 = /a{3,}b/
console.log(reg4.test("ab"))        // false
console.log(reg4.test("aab"))       // false
console.log(reg4.test("aaab"))      // true
console.log(reg4.test("aaaab"))     // true
console.log(reg4.test("haaab"))     // true
console.log(reg4.test("haaac"))     // false
console.log(reg4.test("dddhaaab"))  // true

{n,m} 的用法

表示匹配前面的字符至少 n 次,至多 m 次

var reg5 = /a{3,6}b/
console.log(reg5.test("aab"))       // false
console.log(reg5.test("aaab"))      // true
console.log(reg5.test("aaaab"))     // true
console.log(reg5.test("haaab"))     // true
console.log(reg5.test("haaac"))     // false
console.log(reg5.test("dddhaaab"))  // true

^的用法

表示设置字符串的开头

var aaa = /^ab+c/
console.log(aaa.test("babc"))   // false
console.log(aaa.test("aabc"))   // false
console.log(aaa.test("abac"))   // false
console.log(aaa.test("abcc"))   // true
console.log(aaa.test("abbcc"))  // true

$的用法

表示设置字符串的开头

var aaa = /ab+c$/
console.log(aaa.test("babc"))   // true
console.log(aaa.test("aabc"))   // true
console.log(aaa.test("abac"))   // false
console.log(aaa.test("abcc"))   // false
console.log(aaa.test("abbcc"))  // false

^和$搭配使用

var aaa = /^ab+c$/
console.log(aaa.test("babc"))   // false
console.log(aaa.test("aabc"))   // false
console.log(aaa.test("abac"))   // false
console.log(aaa.test("abcc"))   // false
console.log(aaa.test("abbcc"))  // false
console.log(aaa.test("abbc"))   // true

[] 的使用

指定字符串的匹配规则,这个[]可以设置指定范围但是只占一个字符

// 匹配单个字符
var aaa = /a[bBc]d/
console.log(aaa.test("abd"))     // true
console.log(aaa.test("aBd"))     // true
console.log(aaa.test("aCd"))     // false
console.log(aaa.test("abcd"))    // false
console.log(aaa.test("abded"))   // true

//从匹配区间匹配单个字符 
var aaa = /a[0-9]d/
console.log(aaa.test("a1bd"))      // false
console.log(aaa.test("a2d"))       // true
console.log(aaa.test("a34d"))      // false
console.log(aaa.test("a2d33"))     // true
console.log(aaa.test("34a2d33"))   // true

//单个匹配和匹配范围混用
var aaa = /a[bB0-9]d/
console.log(aaa.test("a1bd"))      // false
console.log(aaa.test("a2d"))       // true
console.log(aaa.test("aad"))       // false
console.log(aaa.test("a2d33"))     // true
console.log(aaa.test("34a2d33"))   // true

[]中使用^来取反

对[]中匹配的规则进行取反操作

var aaa = /a[^0-9]d/
console.log(aaa.test("a1bd"))      // false
console.log(aaa.test("a2d"))       // false
console.log(aaa.test("aad"))       // true
console.log(aaa.test("afd33"))     // true
console.log(aaa.test("34afd33"))   // true

[]和{}搭配使用

var aaa = /a[0-9]{2}d/
console.log(aaa.test("a1bd"))      // false
console.log(aaa.test("a2d"))       // false
console.log(aaa.test("a34d"))      // true
console.log(aaa.test("a345d"))     // false
console.log(aaa.test("wwa45ddd"))  // true

| 的使用

相当于或,可以在多个选项里面进行筛选筛选

var aaa = /doc|xls|ppt|word/
console.log(aaa.test("doc"))      // true
console.log(aaa.test("adocf"))    // true
console.log(aaa.test("xls"))      // true
console.log(aaa.test("a345d"))    // false

\的使用

比如,现在需要写出js的变量命名规则:
、 或 字母开头,后面跟上 0 个或多个 、_ 或字母开头,后面跟上0个或多个 字母开头,后面跟上0个或多个、_、字母或数字。

/^[\$_a-zA-Z][\$_0-9a-zA-Z]*$/i

因为 字符在正则表达式里是个特殊字符,所以要表达“匹配 字符在正则表达式里是个特殊字符,所以要表达“匹配 字符在正则表达式里是个特殊字符,所以要表达匹配字符”的话就要把 字符转义,就是在 字符转义,就是在 字符转义,就是在前面加一个\,变成$像.、+、*、?、^、$、[、]、{、} 等等这些关键字符号,如果要匹配这些字符就要转义。

() 指定一个捕获组

括号除了可以匹配规则的优先级外,还可以充当“捕获组”,比如要匹配的html标签

what可以写成 /<([a-z]+)>/.+<\/\1>/

\1 表示要完全匹配正则里第一个 () 里的规则的内容。 比如第一个 () 里的表达式匹配了body,那\1的部分也要完全匹配body捕获组
() 最多9个, \1 ~ \9 分别与这9个 () 按顺序一一对应

在replace中使用捕获组

捕获组也可以在replace里面用。比如要把 result = first + second - third 里的变量名前面都加上!

console.log('result = first + second - third'.replace(/([a-z]+)/g, '!$1'))
//!result = !first + !second - !third

在replace的第二个参数里,利用是$1, $2, … $9 引用捕获组。

但如果要把 result = first + second - third 里的变量名前面都加上$ 怎么办呢?

console.log('result = first + second - third'.replace(/([a-z]+)/g, '$$1')) 
// $1 = $1 + $1 - $1

对于这种关键字的使用,需要在前面再加上$

console.log('result = first + second - third'.replace(/([a-z]+)/g, '$$$1'))
// $result = $first + $second - $third

在exec中使用捕获组

使用正则的exec方法,可以取出exec中字符串匹配的部分
返回值是一个数组,数组的第一个参数是匹配到的字符串的结果,第二个参数是匹配到的第一捕获组的内容,数组的第n个参数是匹配到的捕获组的第n-1个内容,数组的倒数第2个元素是捕获组的起始下标,倒数第一个是被执行的字符串

console.log(/<([a-z]+)>/.exec("111<br>222<br>333"))  
// ["<br>","br"] 
console.log(/^(\w+)\.(jpg|jpeg|bmp|png|gif)$/i.exec('_dsdddda.png')) 
// ["_dsdddda.png","_dsdddda","png"]

贪婪模式

*、+ 和 ? 的匹配属于贪婪模式
贪婪模式顾名思义就是尽可能多的去匹配,
例如/a.b/,.是符合贪婪模式的,尽可能多的匹配,所以是以来进行贪婪匹配,因为可以更多的匹配到字符串

var bbb = "abcccccccbcc".replace(/a.*b/, 'Q')
console.log(bbb) //Qcc

非贪婪模式

顾名思义会尽可能少的匹配。做法就是在 *、+、? 的后面再加一个问号

var bbb = 'abcccccccbcc'.replace(/a.*?b/, 'Q')
console.log(bbb) //Qcccccccbcc

常用的简写

  1. [0-9] 的简写 \d
    [0-9]{2, 6} 表示匹配2~6个数字, 可以写成 \d{2, 6}
  2. 空白符的简写 \s
    ‘H E L L O’.replace(/\s/g, ‘’) — “HELLO”
  3. 匹配_、数字或字母的简写 \w
    ‘_123ABC…:‘’.replace(/\w/g, ‘Q’) // QQQQQQQ…:

简写是区分大小写的,如果简写里面是大写 就代表取反的意思
如:‘_123ABC…:‘’.replace(/\W/g, ‘Q’) // _123ABCQQQQ

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

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

相关文章

记录日志中logback和log4j2不能共存的问题

本文章记录设置两个日志时候&#xff0c;控制台直接报错 标黄处就是错误原因&#xff1a;1. SLF4J(W)&#xff1a;类路径包含多个SLF4J提供程序。 SLF4J(W)&#xff1a;找到提供程序[org.apache.logging.slf4j. net]。 SLF4J(W)&#xff1a;找到提供程序[ch.qos.log .classi…

丹摩征文活动 |通过Pycharm复现命名实体识别模型--MECT模型

文章目录 &#x1f34b;1 引言&#x1f34b;2 平台优势&#x1f34b;3 丹摩平台服务器配置教程&#x1f34b;4 实操案例&#xff08; MECT4CNER-main&#xff09;&#x1f34b;4.1 MECT4CNER-main模型&#x1f34b;4.2 环境配置&#x1f34b;4.3 训练模型&#x1f34b;4.4 数据…

电脑浏览器打不开网页怎么办 浏览器无法访问网页解决方法

我们在使用电脑的时候&#xff0c;使用浏览器是经常的&#xff0c;很多用户在点开浏览器时&#xff0c;却遇到浏览器无法访问网页的情况。那么电脑浏览器打不开网页是什么原因呢&#xff1f;今天小编就给大家分享几个常见的原因和具体的解决方法&#xff0c;希望能对大家有所帮…

YOLOv11实战宠物狗分类

本文采用YOLOv11作为核心算法框架&#xff0c;结合PyQt5构建用户界面&#xff0c;使用Python3进行开发。YOLOv11以其高效的特征提取能力&#xff0c;在多个图像分类任务中展现出卓越性能。本研究针对5种宠物狗数据集进行训练和优化&#xff0c;该数据集包含丰富的宠物狗图像样本…

Struts源码阅读——三个常用的辅助类DispatchAction

Struts源码阅读——三个常用的辅助类 紧接前文&#xff0c;我们来阅读org.apache.struts.actions包中三个常用类的源码。 DispatchAction、LookupDispatchAction 和 MappingDispatchAction 是 Struts 1 框架中的三个常用的辅助类&#xff0c;用来简化 Action 类中的请求分发。…

Linux设置Nginx开机启动

操作系统环境&#xff1a;CentOS 7 【需要 root 权限&#xff0c;使用 root 用户进行操作】 原理&#xff1a;利用 systemctl 管理服务 设置 Nginx 开机启动 需要 root 权限&#xff0c;普通用户使用 sudo 进行命令操作 原理&#xff1a;利用 systemctl 管理服务 1、新建…

C# WPF 记录DataGrid的表头顺序,下次打开界面时应用到表格中

效果&#xff1a; 代码实现 前端 <DataGrid x:Name"DataGrid1"<!--定义当列位置变化后的触发事件-->CanUserReorderColumns"True"ColumnReordered"DataGrid_ColumnReordered"rubyer:ControlHelper.FocusedForegroundBrush"{Stati…

Transformer-BiLSTM、Transformer、CNN-BiLSTM、BiLSTM、CNN五模型多变量回归预测

Transformer-BiLSTM、Transformer、CNN-BiLSTM、BiLSTM、CNN五模型多变量回归预测 目录 Transformer-BiLSTM、Transformer、CNN-BiLSTM、BiLSTM、CNN五模型多变量回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 吐血售&#xff01;聚划算&#xff01;Transforme…

面试官:如何设计一个能够支持高并发的系统?

强烈推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站:人工智能 设计一个支持高并发的系统是一个系统工程&#xff0c;涉及多个层面的优化。以下逐一展开说明&#xff1a; 1. 分布式架…

企业数字化转型指南:如何通过价值流推动业务创新与变革

在全球企业加速数字化转型的浪潮中&#xff0c;企业领导者和技术人员必须理解数字化转型的核心不只是技术的应用&#xff0c;而是业务流程的彻底重塑。根据《价值流&#xff08;Value Streams&#xff09;》中的理论框架&#xff0c;数字化转型的关键在于价值流&#xff08;Val…

知识库管理系统:企业数字化转型的加速器

在数字化转型的大潮中&#xff0c;知识库管理系统&#xff08;KBMS&#xff09;已成为企业提升效率和创新能力的关键工具。本文将探讨知识库管理系统的定义、企业建立知识库的必要性&#xff0c;以及如何快速搭建企业知识库。 知识库管理系统是什么&#xff1f; 知识库管理系统…

Python 绘图工具详解:使用 Matplotlib、Seaborn 和 Pyecharts 绘制散点图

目录 数据可视化1.使用 matplotlib 库matplotlib 库 2 .使用 seaborn 库seaborn 库 3 .使用 pyecharts库pyecharts库 注意1. 确保安装了所有必要的库2. 检查Jupyter Notebook的版本3. 使用render()方法保存为HTML文件4. 使用IFrame在Notebook中显示HTML文件5. 检查是否有其他输…

JAVA学习日记(十五) 数据结构

一、数据结构概述 数据结构是计算机底层存储、组织数据的方式。 数据结构是指数据相互之间以什么方式排列在一起的。 数据结构是为了更加方便的管理和使用数据&#xff0c;需要结合具体的业务场景来进行选择。 二、常见的数据结构 &#xff08;一&#xff09;栈 特点&…

【C++】—掌握STL vector 类:“Vector简介:动态数组的高效应用”

文章目录 1.vector的介绍和使用1.1vector的介绍1.2 vector的特点1.3vector的使用1.3.1vector的定义1.3.2vector iterator的使用1.3.3vector 的空间增长问题1.3.4 vector 的增删查改1.3.5vector 迭代器失效问题 1.vector的介绍和使用 1.1vector的介绍 vector是一个顺序容器&am…

PTE-中间件安全

DOCKER环境&#xff0c;一般是80 8080 8081端口 1 apache位置扩展名解析漏洞 cd vulhub-master/httpd/apache_parsing_vulnerability/ docker-compose up -d 修改一句话的后缀 直接上传 蚁剑 2 CVE-2017-15715 docker-compose stop cd .. cd CVE-2017-15715/ dock…

Python用CEEMDAN-LSTM-VMD金融股价数据预测及SVR、AR、HAR对比可视化

全文链接&#xff1a;https://tecdat.cn/?p38224 分析师&#xff1a;Duqiao Han 股票市场是一个复杂的非线性系统&#xff0c;股价受到许多经济和社会因素的影响。因此&#xff0c;传统的线性或近线性预测模型很难有效、准确地预测股票指数的价格趋势。众所周知&#xff0c;深…

【Revit二次开发】创建Ribbon选项卡与带图标的按钮

效果图 创建一个叫做“开发的插件”的选项卡&#xff0c; 选项卡内有一个叫做“Hello”的图标按钮&#xff0c; 点击按钮后运行一个命令&#xff0c; 该命令弹出提示框“Hello Revit!”。 在此示例基础上&#xff0c;可以根据需要替换图标、文字、命令功能。 步骤 安装Revit…

Java面试要点18 - Java运行时多态与编译时多态

本文目录 一、引言二、运行时多态的实现三、编译时多态的实现四、多态与接口五、多态的实际应用六、总结 一、引言 多态是面向对象编程的三大特性之一&#xff0c;它允许我们以统一的方式处理不同类型的对象。Java中的多态分为两种&#xff1a;编译时多态&#xff08;重载&…

使用@react-three/fiber,@mkkellogg/gaussian-splats-3d加载.splat,.ply,.ksplat文件

前言 假设您正在现有项目中集成这些包&#xff0c;而该项目的构建工具为 Webpack 或 Vite。同时&#xff0c;您对 Three.js 和 React 有一定的了解。如果您发现有任何错误或有更好的方法&#xff0c;请随时留言。 安装 npm install three types/three react-three/fiber rea…

HBase理论_背景特点及数据单元及与Hive对比

本文结合了个人的笔记以及工作中实践经验以及参考HBase官网&#xff0c;我尽可能把自己的知识点呈现出来&#xff0c;如果有误&#xff0c;还请指正。 1. HBase背景 HBase作为面向列的数据库运行在HDFS之上&#xff0c;HDFS缺乏随机读写操作&#xff0c;HBase正是为此而出现。…