通俗易懂的正则表达式

正则表达式的英文是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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

FPGA/Verilog,Quartus环境下if-else语句和case语句RT视图对比/学习记录

基本概念 RTL&#xff08;Register - Transfer - Level&#xff09;视图&#xff1a;是一种硬件描述语言的抽象层次&#xff0c;用于描述数字电路中寄存器之间的数据传输和操作。在这个层次上&#xff0c;可以看到电路的基本结构&#xff0c;如寄存器、组合逻辑、多路复用器等…

react的创建与书写

一&#xff1a;创建项目 超全面详细一条龙教程&#xff01;从零搭建React项目全家桶&#xff08;上篇&#xff09; - 知乎 1.创建一个文件夹&#xff0c;shift鼠标右键选择在此处打开powershell 2.为了加速npm下载速度&#xff0c;先把npm设置为淘宝镜像地址。 npm config s…

【动态规划】两个数组的 dp 问题

1. 最长公共子序列 1143. 最长公共子序列 状态表示&#xff1a; dp[i][j] 表示 s1 的 0 ~ i 区间和 s2 的 0 ~ j 区间内所有子序列中&#xff0c;最长公共子序列的长度 状态转移方程&#xff1a; 当 s1[i] 和 s2[j] 相等时&#xff0c;那么最长公共子序列一定是以这两个位置…

【计算机网络】【传输层】【习题】

计算机网络-传输层-习题 文章目录 10. 图 5-29 给出了 TCP 连接建立的三次握手与连接释放的四次握手过程。根据 TCP 协议的工作原理&#xff0c;请填写图 5-29 中 ①~⑧ 位置的序号值。答案技巧 注&#xff1a;本文基于《计算机网络》&#xff08;第5版&#xff09;吴功宜、吴英…

nacos集群部署与配置

Nacos集群模式 1. 预备环境准备 请确保是在环境中安装使用: 64 bit OS Linux/Unix/Mac&#xff0c;推荐使用Linux系统。64 bit JDK 1.8&#xff1b;下载. 配置。Maven 3.2.x&#xff1b;下载. 配置。3个或3个以上Nacos节点才能构成集群 ubuntu中假如没安装jdk&#xff0c;则…

Python学习从0到1 day26 第三阶段 Spark ③ 数据计算 Ⅱ

目录 一、Filter方法 功能 语法 代码 总结 filter算子 二、distinct方法 功能 语法 代码 总结 distinct算子 三、SortBy方法 功能 语法 代码 总结 sortBy算子 四、数据计算练习 需求&#xff1a; 解答 总结 去重函数&#xff1a; 过滤函数&#xff1a; 转换函数&#xff1a; 排…

Jmeter基础篇(23)TPS和QPS的异同

前言 这是一篇性能测试指标的科普文章哦&#xff01; TPS和QPS是同一个概念吗&#xff1f; TPS&#xff08;Transactions Per Second&#xff09;和QPS&#xff08;Queries Per Second&#xff09;虽然都是衡量系统性能的指标&#xff0c;但是它们并不是同一个概念。这两个各…

IEC60870-5-104 协议源码架构详细分析

IEC60870-5-104 协议源码架构 前言一、资源三、目录层级一二、目录层级二config/lib60870_config.hdependencies/READMEexamplesCMakeLists.txtcs101_master_balancedcs104_client_asyncmulti_client_servertls_clienttls_server说明 make这些文件的作用是否需要导入这些文件&a…

机器学习在网络安全中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 机器学习在网络安全中的应用 机器学习在网络安全中的应用 机器学习在网络安全中的应用 引言 机器学习概述 定义与原理 发展历程 …

JUC基础类-AbstractQueuedSynchronizer

AbstractQueuedSynchronizer 1、AbstractQueuedSynchronizer概述2、AbstractQueuedSynchronizer源码分析2.1 AQS源码2.2 Node类 如有侵权&#xff0c;请联系&#xff5e; 如有问题&#xff0c;也欢迎批评指正&#xff5e; 1、AbstractQueuedSynchronizer概述 AbstractQueuedSy…

文献阅读 | Nature Methods:使用 STAMP 对空间转录组进行可解释的空间感知降维

文献介绍 文献题目&#xff1a; 使用 STAMP 对空间转录组进行可解释的空间感知降维 研究团队&#xff1a; 陈金妙&#xff08;新加坡科学技术研究局&#xff09; 发表时间&#xff1a; 2024-10-15 发表期刊&#xff1a; Nature Methods 影响因子&#xff1a; 36.1&#xff0…

Redis系列之底层数据结构ZipList

Redis系列之底层数据结构ZipList 实验环境 Redis 6.0 什么是Ziplist&#xff1f; Ziplist&#xff0c;压缩列表&#xff0c;这种数据结构会根据存入数据的类型和大小&#xff0c;分配大小不同的空间&#xff0c;所以是为了节省内存而采用的。因为这种数据结构是一种完整连续…

界面控件DevExpress WPF中文教程:TreeList视图及创建分配视图

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

数据结构中数据有序性/ 单调性 ——二分查找

以下记录的都是闭区间写法 例题&#xff1a;34. 在排序数组中查找元素的第一个和最后一个位置 1.关系转换 寻找目标值有四种情况&#xff1a;≥、>、≤、< 比如目标值x&#xff0c; 可以转化为 ≥x、≥ x1、≤x、≤ x1 比如数组大小为6&#xff0c;目标值为…

探索Python的HTTP利器:Requests库的神秘面纱

文章目录 **探索Python的HTTP利器&#xff1a;Requests库的神秘面纱**一、背景&#xff1a;为何选择Requests库&#xff1f;二、Requests库是什么&#xff1f;三、如何安装Requests库&#xff1f;四、Requests库的五个简单函数使用方法1. GET请求2. POST请求3. PUT请求4. DELET…

《Linux从小白到高手》综合应用篇:深入详解Linux swap及其调整优化

1. 引言&#xff1a; Swap是存储设备上的一块空间&#xff08;分区&#xff09;&#xff0c;操作系统可以在这里暂存一些内存里放不下的东西。这从某种程度上相当于增加了服务器的可用内存。虽然从swap读写比内存慢&#xff0c;但总比没有好&#xff0c;算是内存不足时一种比较…

SpringMVC学习笔记(一)

一、SpringMVC的基本概念 &#xff08;一&#xff09;三层架构和MVC 1、三层架构概述 我们的开发架构一般都是基于两种形式&#xff0c;一种是 C/S 架构&#xff0c;也就是客户端/服务器&#xff0c;另一种是 B/S 架构&#xff0c;也就是浏览器服务器。在 JavaEE 开发中&…

小面馆叫号取餐流程 佳易王面馆米线店点餐叫号管理系统操作教程

一、概述 【软件资源文件下载在文章最后】 小面馆叫号取餐流程 佳易王面馆米线店点餐叫号管理系统操作教程 点餐软件以其实用的功能和简便的操作&#xff0c;为小型餐饮店提供了高效的点餐管理解决方案&#xff0c;提高了工作效率和服务质量 ‌点餐管理‌&#xff1a;支持电…

【.NET 8 实战--孢子记账--从单体到微服务】--简易权限--角色可访问接口管理

咱们继续来编写孢子记账的简易权限&#xff0c;这篇文章中我们将编写角色可访问接口的管理API&#xff0c;同样我不会把完整的代码全都列出来&#xff0c;只会列出部分代码&#xff0c;其余代码我希望大家能自己手动编写&#xff0c;然后对比项目代码。废话不多说&#xff0c;开…

Linux上Python使用MySQLdb包连接MySQL5.7和MySQL8的问题

在一台安装有MySQL8的Linux上用MySQLdb包连接MySQL5.7&#xff0c;连接参数中加上ssl_mode‘DISABLED’,能正常连接&#xff1b;不加ssl_mode参数&#xff0c;会报 而在连接MySQL8时加不加ssl_mode都能正常连接&#xff0c;但在使用过程&#xff0c;加了ssl_mode参数&#xff…