第二章正则表达式

2023-11-01

第二章 正则表达式

1. 学习目标

  • 掌握正则表达式的作用
  • 掌握正则表达式的语法
  • 了解常见的正则表达式

2. 内容讲解

2.1 正则表达式的概念

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。用我们自己的话来说: 正则表达式用来校验字符串是否满足一定的规则的公式

2.2 正则表达式的用途

所以正则表达式有三个主要用途:

  • 模式验证: 检测某个字符串是否符合规则,例如检测手机号、身份证号等等是否符合规范
  • 匹配读取: 将目标字符串中满足规则的部分读取出来,例如将整段文本中的邮箱地址读取出来
  • 匹配替换: 将目标字符串中满足标准的部分替换为其他字符串,例如将整段文本中的"hello"替换成"haha"

2.3 正则表达式的语法

2.3.1 创建正则表达式对象

  • 对象形式:var reg = new RegExp("正则表达式")当正则表达式中有"/"那么就使用这种
  • 直接量形式:var reg = /正则表达式/一般使用这种声明方式

2.3.2 正则表达式入门案例

2.3.2.1 模式验证: 校验字符串中是否包含’o’字母

注意:这里是使用正则表达式对象调用方法。

// 创建一个最简单的正则表达式对象
var reg = /o/;

// 创建一个字符串对象作为目标字符串
var str = 'Hello World!';

// 调用正则表达式对象的test()方法验证目标字符串是否满足我们指定的这个模式,返回结果true
console.log("字符串中是否包含'o'="+reg.test(str));

2.3.2.2 匹配读取: 读取字符串中的所有’o’

//匹配读取: 读取一个字符串中的所有'l'字母
// g表示全文查找,如果不使用g那么就只能查找到第一个匹配的内容
//1. 编写一个正则表达式
var reg2 = /l/g
//2. 使用正则表达式去读取字符串
var arr = str.match(reg2);
console.log(arr)

2.3.2.3 匹配替换: 将字符串中的第一个’o’替换成’@’

var newStr = str.replace(reg,'@');
// 只有第一个o被替换了,说明我们这个正则表达式只能匹配第一个满足的字符串
console.log("str.replace(reg)="+newStr);//Hell@ World!
// 原字符串并没有变化,只是返回了一个新字符串
console.log("str="+str);//str=Hello World!

2.3.3 正则表达式的匹配模式

2.3.3.1 全文查找

如果不使用g对正则表达式对象进行修饰,则使用正则表达式进行查找时,仅返回第一个匹配;使用g后,返回所有匹配。

// 目标字符串
var targetStr = 'Hello World!';

// 没有使用全局匹配的正则表达式
var reg = /[A-Z]/;
// 获取全部匹配
var resultArr = targetStr.match(reg);
// 数组长度为1
console.log("resultArr.length="+resultArr.length);

// 遍历数组,发现只能得到'H'
for(var i = 0; i < resultArr.length; i++){
    console.log("resultArr["+i+"]="+resultArr[i]);
}

对比代码:

// 目标字符串
var targetStr = 'Hello World!';

// 使用了全局匹配的正则表达式
var reg = /[A-Z]/g;
// 获取全部匹配
var resultArr = targetStr.match(reg);
// 数组长度为2
console.log("resultArr.length="+resultArr.length);

// 遍历数组,发现可以获取到“H”和“W”
for(var i = 0; i < resultArr.length; i++){
    console.log("resultArr["+i+"]="+resultArr[i]);
}

2.3.3.2 忽略大小写

//目标字符串
var targetStr = 'Hello WORLD!';

//没有使用忽略大小写的正则表达式
var reg = /o/g;
//获取全部匹配
var resultArr = targetStr.match(reg);
//数组长度为1
console.log("resultArr.length="+resultArr.length);
//遍历数组,仅得到'o'
for(var i = 0; i < resultArr.length; i++){
    console.log("resultArr["+i+"]="+resultArr[i]);
}

对比代码:

//目标字符串
var targetStr = 'Hello WORLD!';

//使用了忽略大小写的正则表达式
var reg = /o/gi;
//获取全部匹配
var resultArr = targetStr.match(reg);
//数组长度为2
console.log("resultArr.length="+resultArr.length);
//遍历数组,得到'o'和'O'
for(var i = 0; i < resultArr.length; i++){
    console.log("resultArr["+i+"]="+resultArr[i]);
}

2.3.3.3 多行查找

不使用多行查找模式,目标字符串中不管有没有换行符都会被当作一行。

//目标字符串1
var targetStr01 = 'Hello\nWorld!';
//目标字符串2
var targetStr02 = 'Hello';

//匹配以'Hello'结尾的正则表达式,没有使用多行匹配
var reg = /Hello$/;
console.log(reg.test(targetStr01));//false

console.log(reg.test(targetStr02));//true

对比代码:

//目标字符串1
var targetStr01 = 'Hello\nWorld!';
//目标字符串2
var targetStr02 = 'Hello';

//匹配以'Hello'结尾的正则表达式,使用了多行匹配
var reg = /Hello$/m;
console.log(reg.test(targetStr01));//true

console.log(reg.test(targetStr02));//true

2.3.4 元字符

在正则表达式中被赋予特殊含义的字符,不能被直接当做普通字符使用。如果要匹配元字符本身,需要对元字符进行转义,转义的方式是在元字符前面加上“\”,例如:^

2.3.4.1 常用的元字符

代码 说明
. 匹配除换行字符以外的任意字符。
\w 匹配字母或数字或下划线等价于[a-zA-Z0-9_]
\W 匹配任何非单词字符。等价于A-Za-z0-9_
\s 匹配任意的空白符,包括空格、制表符、换页符等等。等价于[\f\n\r\t\v]。
\S 匹配任何非空白字符。等价于\f\n\r\t\v。
\d 匹配数字。等价于[0-9]。
\D 匹配一个非数字字符。等价于0-9
\b 匹配单词的开始或结束
^ 匹配字符串的开始,但在[]中使用表示取反
$ 匹配字符串的结束

2.3.4.2 例子一

var str = 'one two three four';
// 匹配全部空格
var reg = /\s/g;
// 将空格替换为@
var newStr = str.replace(reg,'@'); // one@two@three@four
console.log("newStr="+newStr);

2.3.4.3 例子二

var str = '今年是2014年';
// 匹配至少一个数字
var reg = /\d+/g;
str = str.replace(reg,'abcd');
console.log('str='+str); // 今年是abcd年

2.3.4.4 例子三

var str01 = 'I love Java';
var str02 = 'Java love me';
// 匹配以Java开头
var reg = /^Java/g;
console.log('reg.test(str01)='+reg.test(str01)); // flase
console.log("<br />");
console.log('reg.test(str02)='+reg.test(str02)); // true

2.3.4.5 例子四

var str01 = 'I love Java';
var str02 = 'Java love me';
// 匹配以Java结尾
var reg = /Java$/g;
console.log('reg.test(str01)='+reg.test(str01)); // true
console.log("<br />");
console.log('reg.test(str02)='+reg.test(str02)); // flase

2.3.5 字符集合

语法格式 示例 说明
[字符列表] 正则表达式:[abc] 含义:目标字符串包含abc中的任何一个字符 目标字符串:plain 是否匹配:是 原因:plain中的“a”在列表“abc”中 目标字符串中任何一个字符出现在字符列表中就算匹配。
[^字符列表] [^abc] 含义:目标字符串包含abc以外的任何一个字符 目标字符串:plain 是否匹配:是 原因:plain中包含“p”、“l”、“i”、“n” 匹配字符列表中未包含的任意字符。
[字符范围] 正则表达式:[a-z] 含义:所有小写英文字符组成的字符列表 正则表达式:[A-Z] 含义:所有大写英文字符组成的字符列表 匹配指定范围内的任意字符。
var str01 = 'Hello World';
var str02 = 'I am Tom';
//匹配abc中的任何一个
var reg = /[abc]/g;
console.log('reg.test(str01)='+reg.test(str01));//flase
console.log('reg.test(str02)='+reg.test(str02));//true

2.3.6 出现次数

代码 说明
* 出现零次或多次
+ 出现一次或多次
? 出现零次或一次
{n} 出现n次
{n,} 出现n次或多次
{n,m} 出现n到m次
console.log("/[a]{3}/.test('aa')="+/[a]{3}/g.test('aa')); // flase
console.log("/[a]{3}/.test('aaa')="+/[a]{3}/g.test('aaa')); // true
console.log("/[a]{3}/.test('aaaa')="+/[a]{3}/g.test('aaaa')); // true

2.3.7 在正则表达式中表达『或者』

使用符号:|

// 目标字符串
var str01 = 'Hello World!';
var str02 = 'I love Java';
// 匹配'World'或'Java'
var reg = /World|Java/g;
console.log("str01.match(reg)[0]="+str01.match(reg)[0]);//World
console.log("str02.match(reg)[0]="+str02.match(reg)[0]);//Java

2.4 常用正则表达式

需求 正则表达式
用户名 /1[a-zA-Z_-0-9]{5,9}$/
密码 /2{6,12}$/
前后空格 /^\s+|\s+$/g
电子邮箱 /3+@([a-zA-Z0-9-]+[.]{1})+[a-zA-Z]+$/

  1. a-zA-Z_ ↩︎

  2. a-zA-Z0-9_-@#&* ↩︎

  3. a-zA-Z0-9_.- ↩︎

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第二章正则表达式 的相关文章

  • 在 SQL 中,如何从 SELECT * FROM ... 中排除结果?

    我知道我的标题不太具有描述性 让我在这里详细解释一下 假设一个表有 26 个字段 例如字段 a 字段 z 我只想要一个选择查询只返回 15 个字段 所以 通常 我会执行 SELECT field a field b field o FROM
  • PHP MySQL 使用选项/选择 HTML 表单标签进行多重搜索查询

    我正在尝试使用两个搜索字段设置基本的 MySQL LIKE 搜索 我不想拥有它 所以它有多个可选搜索字段 例如if isset POST city isset POST name 我不知道如何用 HTML 来做到这一点
  • Mysql用in语句限制

    我正在写一个查询 SELECT user bookmarks id as user bookmark id bookmark id user bookmarks user id bookmark url bookmark website b
  • Gradle 构建错误:无法从 https://repo1.maven.org/maven2/io/fabric/tools/gradle/maven-metadata.xml 加载 Maven 元数据

    我在 Android studio 中遇到 gradle 构建错误 如下所示 Error A problem occurred configuring project MyApp Could not resolve all dependen
  • mysql自动存储记录创建时间戳

    mysql 有什么方法可以在创建记录时自动将时间戳存储在记录行中 我试图使用时间戳 数据类型 和 current timestamp 作为默认值 但后来意识到每次更新记录时都会更新 我只需要一些可以存储创建时间戳的东西 Thanks Set
  • 学说迁移后备

    我们正在使用原则迁移 当迁移包含多个操作并且其中一个操作失败时 通常会出现问题 例如 如果迁移添加了 5 个外键 其中第 5 个失败 而字段长度不同 则修复字段错误并重新生成迁移不会not修复整个问题 而现在出现一个与 4 个密钥已存在有关
  • MySQL 追加字符串

    How can I append a string to the end of an existing table value Let s say I have the table below And let s say that Mari
  • 从Django中具有外键关系的两个表中检索数据? [复制]

    这个问题在这里已经有答案了 This is my models py file from django db import models class Author models Model first name models CharFie
  • Eclipse Maven Spring 项目 - 错误

    I need help with an error which make me crazy I started to study Java EE and I am going through tutorial on youtube Ever
  • 通过触发器应用表的列权限

    现在 我有一个名为 Members 的表 其中包含内容 分为联系人数据 银行数据 现在 管理员应该能够创建 更新 删除用户 这些用户保存在另一个表中 该表只能访问管理员 用户应该获得自己的 mysql 用户帐户 管理员还应该能够设置权限 例
  • post php mysql 的拆分关键字

    我有一个表存储帖子 ID 它的标签如下 Post id Tags 1 keyword1 keyword2 keyword3 我想循环遍历该表中的每一行并执行以下操作 将关键字1 关键字2 关键字3放入新表中 word id word val
  • Visual Studio Code:运行 Maven 时无法识别环境变量

    我正在尝试为 Maven 重新创建 Eclipse 运行配置 我在launch json中添加了环境变量 env environment test applicationname asset misc api log level debug
  • mysql 版本号排序

    我有这样的价值观 1 1 2 9 1 2 2 4 1 2 3 4 3 2 14 3 2 1 4 2 我需要使用 mysql 对这些值进行排序 该数据类型是 varbinary 300 所需的输出将类似于 1 1 2 1 2 3 4 2 2
  • 加载“mysql2”Active Record 适配器时出错

    我正在尝试升级我的应用程序 这是我在部署应用程序时遇到的错误 加载 mysql2 Active Record 适配器时出错 缺少它所依赖的宝石 无法激活mysql2 0 4 4 已经激活mysql2 0 3 21 确保所有依赖项都添加到 G
  • WHERE 值不在(子查询)

    我一直在努力解决这个问题 我有两张桌子 一张带有优惠券和发票号码的 一张带有发票号码和客户姓名的 我需要找到尚未使用优惠券的顾客 以下是表格 促销表 Promotions Invoice Coupon 1 couponA 2 couponB
  • 查询和扫描多行性能缓慢

    下面的查询一行的执行时间为 6 18 分钟 Exception type 1 的基数值为 3 我不知道如何提高性能 Query select count 1 as rage tap from summary funnel 1066 s jo
  • 将 NULL 变量插入数据库

    我将变量设置为 NULL 我试图将其插入数据库 但由于某种原因 它们一直以 0 的形式提交 我确信我试图插入的列允许 NULL 并且默认值设置为 NULL 这是我的代码 insert NULL query mysql query INSER
  • 在 MySQL 中将值设置为 NULL

    我想要一个值被设置为NULL如果我提交的表单中的文本框中没有输入任何内容 我怎样才能做到这一点 我试过插入 NULL 但这只是添加了这个词NULL进入现场 我不确定我应该为此提供什么代码 我只是编写一个 UPDATE 查询 不要放NULL更
  • 使用 order by 和 limit 从多个表中删除

    我试图从使用 ORDER BY DESC 和 LIMIT 有关系的两个表中删除 DELETE FROM my rel table AS t1 LEFT JOIN my photo table AS t2 ON t2 typeid t1 ty
  • 覆盖 Vagrantfile 自定义 JSON 数据中的 Cookbook 属性

    如何在 Vagrant 文件中使用chef json 访问node override 例如 使用vagrant berkshelf 我正在尝试安装基于自定义 JSON 数据的特定 Maven 版本Vagrantfile chef json

随机推荐

  • 有人知道乐高机器人和乐高少儿编程区别吗

    乐高机器人和乐高少儿编程区别 现在很多的家长对于孩子的学习可以说是非常的用心 就拿现在很多的家长在给孩子选择少儿编程的学习课程的时候 可以说是非常的用心 就想要给孩子选择一个对于孩子有好处的课程 但是很多的家长对于乐高机器人和少儿编程的了解
  • 老猿学5G:融合计费的Nchf和Nchf‘服务化接口消息Nchf_ConvergedCharging_Create、Update、Release和Notify

    老猿Python博文目录 一 引言 在 老猿学5G扫盲贴 中国移动的5G计费架构解读 介绍了5G融合计费的服务化接口包括 CHF提供给CTF使用的Nchf接口 OCF提供给CHF使用的Nchf 接口 这两个接口消息的内容都相同 只是服务端和
  • 安卓端自行实现工信部要求的隐私合规检测一(教你手写Xposed模块代码)

    前言 原文地址 安卓端自行实现工信部要求的隐私合规检测一 教你手写Xposed模块代码 转载者言 只是简单监控隐私权限可以使用Android 11的新特性AppOpsManager OnOpNotedCallback 参考下面文章 隐私合规
  • Maven中GeoTools的引入 - Maven 的 repository 与 mirror

    Maven中GeoTools的引入 Maven 的 repository 与 mirror 在Maven中引入GeoTools时找不到jar包 搜索了蛮久才明白是自己maven没有学明白 于是重学了一次maven 解决了这个问题 关键在于理
  • python-共现矩阵(共词矩阵)计算

    共现矩阵 共词矩阵 统计文本中两两词组之间共同出现的次数 以此来描述词组间的亲密度 code 我这里求的对角线元素为该字段在文本中出现的总次数 import pandas as pd def gx matrix vol li 整合一下 输入
  • knife4j介绍及使用

    Knife4jInsight是一款致力于基于OpenAPI2及OpenAPI3规范进行聚合的独立中间件 在Knife4j 4 0版本发布之际 作者也对该组件进行了了架构重新设计 代码重构 并也发布了该独立中间件的2 0版本 基于Spring
  • windows使用makefile的三种方法

    windows使用makefile的三种方法 想再在windows上尝试makefile的可以试一试 注意需要下载好mingw 配置好gcc路径 才能成功使用make 第1种方法只需要命令行 2 3种方法需要借助vscode实现 当用户编译
  • Rokoko for Maya

    Rokoko for Maya 动捕应用 一 什么是Rokoko 二 使用 Rokoko Stufio 暂时没打算记录如何操作 Maya插件 rokoko studio live 下载安装 如何使用 三 其他 一 什么是Rokoko Rok
  • Raspberry Pi 与Arduino SPI通信

    本教程介绍了使用SPI 串行外围设备接口总线 进行Raspberry Pi与Arduino通讯和控制的基本框架 SPI代表了一种非常完善的芯片间通信方法 该方法在两种设备的硬件中均实现 在这里 我们将详细探讨SPI 讨论硬件和软件注意事项
  • 波次

    播种式分拣是以汇总了多份订单的一个批次为单位进行分拣作业的 业内通常将这个作业的批次称为 波次 为了达到较高的工作效率 播种式分拣一般希望每个波次汇总较多的订单 但由于以下原因 每个波次汇总的订单绝不是越多越好 1完成订单的时间限制 通常情
  • JavaMail邮件发送不成功的那些坑人情况及分析说明

    前言 JavaMail的使用本身并不难 网上有不少案例 简单易懂 而且有详细的中文注解 但是由于JavaMail的机制设置不够完善 特别是异常出错时的参考信息太少 给初学者造成了不少麻烦 而我就是其中之一 在此 把我遇到过得那些坑总结出来
  • 图解人工智能知识架构(从知识角度告诉你人工智能到底学些啥)

    很多人都想学习人工智能 但是却不知道该学些啥 从宏观的视角搞清楚人工智能到底需要学习哪些领域的知识是至关重要的 这就好比要去逛一座大的商场 非常需要一份商场的楼层导览图 它能够告诉你各个楼层商户的分布 又好比去一个风景区游玩 非常需要一份景
  • VS2022安装easyx图形库教程

    下载easyx图形库 下载地址 EasyX Graphics Library for C 下载好后安装 点击安装 安装 前两项 easyx会自动识别VS版本 我们点击安装 安装好以后重启VS 测试一下 安装easyx推行库成功 问题 那么e
  • 5分钟带你快速了解微服务框架的前世今生

    目录 原始时代 青铜时代 黄金时代 铂金时代 钻石时代 星耀时代 王者时代 总结 原始时代 1969年11月 为了便于高校间共享资源 美国国防部高级研究计划管理局建立一个名为阿帕网络ARPAnet 起初只有四个节点 阿帕网起源 一年后阿帕网
  • 编程是一种“组合的艺术”

    编程是一种 组合的艺术 WPF实例分析 金旭亮 有这么一句名言 政治是一种妥协的艺术 这一规律同样适用于软件技术 就我个人的观点 软件开发在一定意义上是一种 组合的艺术 优秀的软件工程师类似于优秀的厨师 能将一些常见的原料变成一盘色香味俱全
  • git常用命令合集(建议收藏)

    1 git init将本文件夹初始化成一个本地git仓库 2 git clone xxx 将github上的远程克隆到本地 3 git add file1 file2 添加文件到暂存区 包括修改的文件 新增的文件 4 git add dir
  • 技术人修炼之道阅读笔记(四)低效的7个行为习惯

    技术人修炼之道阅读笔记 四 低效的7个行为习惯 如今 在许多企业为了提高团队的产出 996 非常盛行 但是效果却往往不令人满意 那么怎么来提高团队的工作效率呢 这里我们进行逆向思维 从造成低效的7个坏习惯说起 因为避免了低效的行为习惯 离高
  • 无限脉冲响应 (IIR) 滤波器

    1 基础知识 某正弦信号 频率为50Hz 这意味着 信号的模拟频率 f 50 Hz 注意它的单位是Hz 信号的表达式为 注意 模拟滤波器设计中用的频率是指模拟角频率 数字滤波器设计中用的频率是指归一化数字角频率 w 2 数字滤波器简介 数字
  • 程序员应对35岁中年危机的措施

    都说程序员是吃青春饭 我也问了一些身边周围的朋友 有已经在工作的 有正在出于中年危机的 有猎头公司工作的 觉得年龄问题对于程序员是一个致命的问题 正处在25左右的我们 应该如何应对10年后的中年危机呢 李开复给程序员的7建议 我觉得很对 特
  • 第二章正则表达式

    第二章 正则表达式 1 学习目标 掌握正则表达式的作用 掌握正则表达式的语法 了解常见的正则表达式 2 内容讲解 2 1 正则表达式的概念 正则表达式是对字符串操作的一种逻辑公式 就是用事先定义好的一些特定字符 及这些特定字符的组合 组成一