中国农村程序员学习此【正则表达式进阶】发明cahtGPT,购买大平层,开上帕拉梅拉,迎娶白富美出任CEO走上人生巅峰

注:最后有面试挑战,看看自己掌握了吗


🌸I could be bounded in a nutshell and count myself a king of infinite space.
 特别鸣谢:木芯工作室
特别鸣谢:木芯工作室 、Ivan from Russia


限制可能的用户名

用户名在互联网上随处可见。 它们是用户在自己喜欢的网站上的唯一身份。

需要检索数据库中的所有用户名。 以下是用户在创建用户名时必须遵守的一些简单规则。

用户名只能是数字字母字符。

用户名中的数字必须在最后。 数字可以有零个或多个。 用户名不能以数字开头。

用户名字母可以是小写字母和大写字母。

用户名长度必须至少为两个字符。 两位用户名只能使用字母。

修改正则表达式 userCheck 以满足上面列出的约束。

let username = "JackOfAllTrades";
let userCheck = /^[a-z][a-z]+\d*$|^[a-z]\d\d+$/i; // 修改这一行
let result = userCheck.test(username);

匹配空白字符

迄今为止的挑战包括匹配字母和数字。 还可以匹配字符之间的空格。

可以使用 \s 搜寻空格,其中 s 是小写。 此匹配模式将匹配空格、回车符、制表符、换页符和换行符。 可以认为这类似于元字符 [ \r\t\f\n\v]

let whiteSpace = "Whitespace. Whitespace everywhere!"
let spaceRegex = /\s/g;
whiteSpace.match(spaceRegex);

这个 match 调用将返回 [" ", " "]

修改正则表达式 countWhiteSpace 查找字符串中的多个空白字符。

let sample = "Whitespace is important in separating words";
let countWhiteSpace = /\s/g; // 修改这一行
let result = sample.match(countWhiteSpace);

匹配非空白字符

已经学会了如何使用带有小写 s 的缩写 \s 来搜寻空白字符。 还可以搜寻除了空格之外的所有内容。

使用 \S 搜寻非空白字符,其中 s 是大写。 此匹配模式将不匹配空格、回车符、制表符、换页符和换行符。 可以认为这类似于元字符 [^ \r\t\f\n\v]

let whiteSpace = "Whitespace. Whitespace everywhere!"
let nonSpaceRegex = /\S/g;
whiteSpace.match(nonSpaceRegex).length;

返回值的 .length 应该是 32。

修改正则表达式 countNonWhiteSpace 以查找字符串中的多个非空字符。

指定匹配的上限和下限

回想一下,使用加号 + 查找一个或多个字符,使用星号 * 查找零个或多个字符。 这些都很方便,但有时需要匹配一定范围的匹配模式。

可以使用数量说明符(quantity specifiers)指定匹配模式的上下限。 数量说明符与花括号({ 和 })一起使用。 可以在花括号之间放两个数字,这两个数字代表匹配模式的上限和下限。

例如,要匹配出现 3 到 5 次字母 a 的在字符串 ah,正则表达式应为/a{3,5}h/。

let A4 = "aaaah";
let A2 = "aah";
let multipleA = /a{3,5}h/;
multipleA.test(A4);
multipleA.test(A2);

第一次 test 调用将返回 true,而第二次调用将返回 false。

修改正则表达式 ohRegex 以匹配出现 3 到 6 次字母 h 的字符串 Oh no。

只指定匹配的下限

可以使用带有花括号的数量说明符来指定匹配模式的上下限。 但有时候只想指定匹配模式的下限而不需要指定上限。

为此,在第一个数字后面跟一个逗号即可。

例如,要匹配至少出现 3 次字母 a 的字符串 hah,正则表达式应该是 /ha{3,}h/

let A4 = "haaaah";
let A2 = "haah";
let A100 = "h" + "a".repeat(100) + "h";
let multipleA = /ha{3,}h/;
multipleA.test(A4);
multipleA.test(A2);
multipleA.test(A100);

按顺序排列,三次 test 调用将返回值 true,false 和 true。

指定匹配的确切数量

可以使用带有花括号的数量说明符来指定匹配模式的上下限。 但有时只需要特定数量的匹配。

要指定一定数量的匹配模式,只需在大括号之间放置一个数字。

例如,要只匹配字母 a 出现 3 次的单词hah,正则表达式应为/ha{3}h/。

let A4 = "haaaah";
let A3 = "haaah";
let A100 = "h" + "a".repeat(100) + "h";
let multipleHA = /ha{3}h/;
multipleHA.test(A4);
multipleHA.test(A3);
multipleHA.test(A100);

按顺序排列,三次 test 调用将返回值 false,true 和 false。

修改正则表达式timRegex,以匹配仅有四个字母 m 的单词 Timber。

检查全部或无

有时,想要搜寻的匹配模式可能有不确定是否存在的部分。 尽管如此,还是想检查它们。

为此,可以使用问号 ? 指定可能存在的元素。 这将检查前面的零个或一个元素。 可以将此符号视为前面的元素是可选的。

例如,美式英语和英式英语略有不同,可以使用问号来匹配两种拼写。

let american = "color";
let british = "colour";
let rainbowRegex= /colou?r/;
rainbowRegex.test(american);
rainbowRegex.test(british);

上面的 test 都会返回 true。

修改正则表达式 favRegex 以匹配美式英语(favorite)和英式英语(favourite)的单词版本。

let favWord = "favorite";
let favRegex = /favou?rite/; // 修改这一行
let result = favRegex.test(favWord);

正向先行断言和负向先行断言

先行断言 (Lookaheads)是告诉 JavaScript 在字符串中向前查找的匹配模式。 当想要在同一个字符串上搜寻多个匹配模式时,这可能非常有用。

有两种先行断言:正向先行断言(positive lookahead)和负向先行断言(negative lookahead)

正向先行断言会查看并确保搜索匹配模式中的元素存在,但实际上并不匹配。 正向先行断言的用法是 (?=…),其中 … 就是需要存在但不会被匹配的部分。

另一方面,负向先行断言会查看并确保搜索匹配模式中的元素不存在。 负向先行断言的用法是 (?!..),其中 … 是希望不存在的匹配模式。 如果负向先行断言部分不存在,将返回匹配模式的其余部分。

尽管先行断言有点儿令人困惑,但是这些示例会有所帮助。

let quit = "qu";
let noquit = "qt";
let quRegex= /q(?=u)/;
let qRegex = /q(?!u)/;
quit.match(quRegex);
noquit.match(qRegex);

这两次 match 调用都将返回 ["q"]

先行断言的更实际用途是检查一个字符串中的两个或更多匹配模式。 这里有一个简单的密码检查器,密码规则是 3 到 6 个字符且至少包含一个数字:

let password = "abc123";
let checkPass = /(?=\w{3,6})(?=\D*\d)/;
checkPass.test(password);

在正则表达式 pwRegex 中使用先行断言以匹配大于 5 个字符且有两个连续数字的密码。

let sampleWord = "astronaut";
let pwRegex = /(?=\w{5,})(?=\D+\d{2,})/; // 修改这一行
let result = pwRegex.test(sampleWord);

检查混合字符组

有时候我们想使用正则表达式里的括号 () 来检查字符组。

如果想在字符串找到 Penguin 或 Pumpkin,可以用这个正则表达式:/P(engu|umpk)in/g。

然后使用 test() 方法检查 test 字符串里面是否包含字符组。

let testStr = "Pumpkin";
let testRegex = /P(engu|umpk)in/;
testRegex.test(testStr);

test 方法会返回 true。

完善正则表达式,使其以区分大小写的方式检查 Franklin Roosevelt 或 Eleanor Roosevelt 的名字,并且应该忽略 middle names。

然后完善代码,使创建的正则检查 myString,根据正则是否匹配返回 true 或 false

let myString = "Eleanor Roosevelt";
let myRegex = /(Franklin|Eleanor) (([A-Z]\.?|[A-Z][a-z]+) )?Roosevelt/;
let result = myRegex.test(myString);

使用捕获组重用模式

当你想要匹配一个像下面这样多次出现的单词,

let repeatStr = "row row row your boat";

你可以使用 /row row row/。但如果你不知道重复的特定单词,怎么办? 捕获组 可以用于找到重复的子字符串。

捕获组是通过把要捕获的正则表达式放在括号中来构建的。 在这个例子里, 目标是捕获一个包含字母数字字符的词,所以捕获组是将 \w+ 放在括号中/(\w+)/。

分组匹配的子字符串被保存到一个临时的“变量”, 可以使用同一正则表达式和反斜线及捕获组的编号来访问它(例如:\1)。 捕获组按其开头括号的位置自动编号(从左到右),从 1 开始

下面的示例是匹配被空格隔开的两个相同单词:

let repeatRegex = /(\w+) \1 \1/;
repeatRegex.test(repeatStr); // Returns true
repeatStr.match(repeatRegex); // Returns ["row row row", "row"]

在字符串上调用 .match() 方法将返回一个数组,其中包含它最终匹配到的子字符串及其捕获组。

在 reRegex 中使用捕获组来匹配一个只由相同的数字重复三次组成的由空格分隔字符串。

let repeatNum = "42 42 42";
let reRegex = /^(\d+) \1 \1$/g; // 修改这一行
let result = reRegex.test(repeatNum);

使用捕获组搜索和替换

搜索功能是很有用的。 但是,当搜索同时也执行更改(或替换)匹配文本的操作时,搜索功能就会显得更加强大。

可以在字符串上使用 .replace() 方法来搜索并替换字符串中的文本。 .replace() 的输入首先是想要搜索的正则表达式匹配模式。 第二个参数是用于替换匹配的字符串或用于执行某些操作的函数

let wrongText = "The sky is silver.";
let silverRegex = /silver/;
wrongText.replace(silverRegex, "blue");

replace 调用将返回字符串 The sky is blue.。

你还可以使用美元符号($)访问替换字符串中的捕获组

"Code Camp".replace(/(\w+)\s(\w+)/, '$2 $1');

调用 replace 将返回字符串 Camp Code

使用三个捕获组编写一个正则表达式 fixRegex,这三个捕获组将搜索字符串 one two three 中的每个单词。 然后更新 replaceText 变量,以字符串 three two one 替换 one two three,并将结果分配给 result 变量。 确保使用美元符号($)语法在替换字符串中使用捕获组。

let str = "one two three";
let fixRegex = /^(\w+)\s(\w+)\s(\w+)$/g; // 修改这一行
let replaceText = "$3 $2 $1"; // 修改这一行
let result = str.replace(fixRegex, replaceText);

删除开头和结尾的空白

有时字符串周围存在的空白字符并不是必需的。 字符串的典型处理是删除字符串开头和结尾处的空格。

编写一个正则表达式并使用适当的字符串方法删除字符串开头和结尾的空格。

注意: String.prototype.trim() 方法在这里也可以实现同样的效果,但是你需要使用正则表达式来完成此项挑战。

let hello = "   Hello, World!  ";
let wsRegex = /^(\s+)|(\s+)$/g; // 修改这一行
let result = hello.replace(wsRegex,""); // 修改这一行

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

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

相关文章

关于电子接插件插拔耐久试验

500次的插拔次数怎么来的? - 知乎 EIA-364-09耐插拔测试方法 - 豆丁网 (docin.com) 连接器的电气性能测试要遵循什么样的国家标准?_插拔_绝缘_规定 (sohu.com) 连接器的插拔寿命标准 - 百度文库 (baidu.com) IEC 60512-1:2018 电气和电子设备用连接器. 试验和测量…

ResNet50卷积神经网络输出数据形参分析-笔记

ResNet50卷积神经网络输出数据形参分析-笔记 ResNet50包含多个模块,其中第2到第5个模块分别包含3、4、6、3个残差块 5049个卷积(3463)*31和一个全连接层 分析结果为: 输入数据形状:[10, 3, 224, 224] 最后输出结果:linear_0 [10,…

【Spring】Spring中的设计模式

文章目录 责任链模式工厂模式适配器模式代理模式模版方法观察者模式构造器模式 责任链模式 Spring中的Aop的通知调用会使用责任链模式责任链模式介绍 角色:抽象处理者(Handler)具体处理者(ConcreteHandler1)客户类角…

Kafka

消息中间件的作用 异步解耦削峰填谷 MQ对比 RabbitMQ 优点:管理界面最好用;支持语言较多; 缺点:不支持扩展(集群) 主要流程:生产者发送消息给交换机,通过路由机制投递到对应的队…

Python入门【​编辑、组合、设计模式_工厂模式实现 、设计模式_单例模式实现、工厂和单例模式结合、异常是什么?异常的解决思路 】(十七)

👏作者简介:大家好,我是爱敲代码的小王,CSDN博客博主,Python小白 📕系列专栏:python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发 📧如果文章知识点有错误…

构造方法 与代理

构造方法 public class Son {String name;/*构造方法1.与类名相同2.没有返回值也没有void*//*作用:实例化初始值使用new关键字必须要有构造器*/public Son(){//无参构造方法this.name"sss";}//有参构造方法public Son(String name){//定义有参构造 就必…

【云存储】使用OSS快速搭建个人网盘教程(阿里云)

使用OSS快速搭建个人网盘 一、基础概要1. 主要的存储类型1.1 块存储1.2 文件存储1.3 对象存储 2. 对象存储OSS2.1 存储空间2.2 地域2.3 对象2.4 读写权限2.5 访问域名(Endpoint)2.6 访问密钥2.7 常用功能(1)创建存储空间&#xff…

WebGL Shader着色器GLSL语言

在2D绘图中的坐标系统,默认情况下是与窗口坐标系统相同,它以canvas的左上角为坐标原点,沿X轴向右为正值,沿Y轴向下为正值。其中canvas坐标的单位都是’px’。 WebGL使用的是正交右手坐标系,且每个方向都有可使用的值的…

MFC第二十六天 CRgn类简介与开发、封装CMemoryDC类并应用开发

文章目录 CRgn类简介与开发CRgn类简介CRgn类区域管理开发CRgn类区域管理与不规则形状的选取 封装CMemoryDC类并应用开发CMemoryDC.h封装CMemoryDC开发游戏透明动画CFlashDlg.hCFlashDlg.cpp 封装CMemoryDC开发游戏动画 附录四大窗口CDC派生类 CRgn类简介与开发 CRgn类简介 CR…

c高级:day3

作业: 1. 整理思维导图 2.判断家目录下,普通文件的个数和目录文件的个数 #!/bin/bash ######################################################################## # File Name: zy1.sh # Created Time: 2023年08月04日 星期五 19时13分08秒 ##############################…

计算机网络(2) --- 网络套接字UDP

计算机网络(1) --- 网络介绍_哈里沃克的博客-CSDN博客https://blog.csdn.net/m0_63488627/article/details/131967378?spm1001.2014.3001.5501 目录 1.端口号 2.TCP与UDP协议 1.TCP协议介绍 1.TCP协议 2.UDP协议 3.理解 2.网络字节序 发送逻辑…

html,css日常记录

动态绑定class,当index3!0时,class的值为bdt :class"{bdt:index3!0}" 动态绑定style中的height和lineheight,其中,height的值为函数px(item.length)的返回值,函数名可以随意取。 :style"{height:px(…

SpringBoot使用@Autowired将实现类注入到List或者Map集合中

前言 最近看到RuoYi-Vue-Plus翻译功能 Translation的翻译模块配置类TranslationConfig,其中有一个注入TranslationInterface翻译接口实现类的写法让我感到很新颖,但这种写法在Spring 3.0版本以后就已经支持注入List和Map,平时都没有注意到这…

基于 Redux + TypeScript 实现强类型检查和对 Json 的数据清理

基于 Redux TypeScript 实现强类型检查和对 Json 的数据清理 突然像是打通了任督二脉一样就用了 generics 搞定了之前一直用 any 实现的类型…… 关于 Redux 的部分,这里不多赘述,基本的实现都在这里:Redux Toolkit 调用 API 的四种方式 和…

机器学习概述及其主要算法

目录 1、什么是机器学习 2、数据集 2.1、结构 3、算法分类 4、算法简介 4.1、K-近邻算法 4.2、贝叶斯分类 4.3、决策树和随机森林 4.4、逻辑回归 4.5、神经网络 4.6、线性回归 4.7、岭回归 4.8、K-means 5、机器学习开发流程 6、学习框架 1、什么是机器学习 机器…

Emacs之set-face-attribute与font-lock-add-keywords用法区别(一百二十八)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

在java中如何使用openOffice进行格式转换,word,excel,ppt,pdf互相转换

1.首先需要下载并安装openOffice,下载地址为: Apache OpenOffice download | SourceForge.net 2.安装后,可以测试下是否可用; 3.build.gradle中引入依赖: implementation group: com.artofsolving, name: jodconverter, version:…

笔记:Android 9系统启动流程

启动流程 1.按下电源,系统启动 当电源键按下时,引导芯片代码(汇编指令)会从预定的地方(固化在ROM)开始执行,将引导程序 BootLoader 加载到 RAM中,然后执行 2.引导程序 BootLoader …

【3维视觉】3D空间常用算法(点到直线距离、面法线、二面角)

3D空间点到直线的距离 3D空间点到直线的距离 3D空间的曲率 三维空间有三个基本元素,点,线,面。那么曲率是如何定义的呢? 点的曲率? 线的曲率? 面的曲率? 法曲率 设曲面上的曲线在某一点处的切…

Unity 使用SharpZipLib解压时报错

报错信息: NotSupportedException: Encoding 936 data could not be found. Make sure you have correct international System.Text.Encoding.GetEncoding (System.Int32 codepage) ICSharpCode.SharpZipLib.Zip.ZipConstants.ConvertToString。 出现问题分析&…