JavaScript学习笔记——11、正则表达式

大家好,我是阿赵。继续学习JavaScript,这次学习的是正则表达式。

一、 什么是正则表达式

正则表达式(Regex)是一种强大的文本模式匹配工具,用于对字符串进行搜索、替换和验证。

正则表达式的作用有:

  1. 匹配
  2. 替换
  3. 提取
      JavaScript主要提供了2个方法来匹配正则表达式:
bash 复制代码
const str = 原字符串
const reg = 正则表达式条件

1. reg.test(str)

判断是否有匹配,如果匹配,则返回true,否则返回false。

例子:

bash 复制代码
  const str = 'Azhao is a handsome boy';
  const reg = /a/;
  const result = reg.test(str);
  console.log(result);

结果:

2. reg.exec(str)

获取匹配的结果,如果匹配,返回一个数组,否则返回null。

例子:

bash 复制代码
  const str = 'Azhao is a handsome boy';
  const reg = /handsome/;
  const result = reg.exec(str);
  console.log(result);

结果:

使用正则表达式最关键的是写正则表达式条件,所以下面会介绍一下。

二、 元字符

在正则表达式里面,输入的内容分为了2种,一种是普通字符,另一种是特殊字符,也叫元字符。

1、 普通字符

只能描述自身,例如所有的字母和数字。

普通字符只能起到完全匹配和它们相同的字符。

上面举的例子,我需要匹配handsome这个单词,本身就是普通字符,如果原始字符串里面包含一模一样的handsome这个单词在里面,就可以匹配得到,否则只要有一点点差别,就会匹配失败。

2、 元字符

具有特殊含义的字符。

举一个例子,如果我们想表达包含包含数字,我们不需要从0到9逐个去匹配,只要写一个[0-9],就可以代表数字,这就是有特殊含义的字符。

元字符的分类:

1. 边界符

表示位置,比如必须用什么开头,或者用什么结尾

(1) 以谁开头

例子:

bash 复制代码
  const str = 'Azhao is a handsome boy';
  const reg = /^Azhao/;
  const result = reg.test(str);
  console.log(result);

这样的结果是true

bash 复制代码
  const str = 'Azhao is a handsome boy';
  const reg = /^handsome/;
  const result = reg.test(str);
  console.log(result);

这样的结果是false。

说明:

通过^符号,可以指定使用什么字符串作为开始。第一个例子^Azhao,意思是使用Azhao作为字符串的开始,在Azhao前面不会再有别的字符了。原字符串的确是Azhao开始的,所以能匹配成功。第二个例子^handsome,虽然原字符串的确包含了handsome字符串,但并不是以它作为开始的,所以匹配不成功。

(2) 以谁结尾

例子:

bash 复制代码
  const str = 'Azhao is a handsome boy';
  const reg = /boy$/;
  const result = reg.test(str);
  console.log(result);

结果是true,这里通过在最后面添加$符号,代表在boy后面就没有其他东西了。

2. 量词

可以表示重复次数,比如:
*:重复0或者更多次

例子:

bash 复制代码
  const str = 'hello world';
  const reg = /hella*o/;
  const result = reg.test(str);
  console.log(result);

结果是true。虽然字符串里面并没有出现hell后面跟着字符串a的情况,但由于星号是重复0或更多次,所以就算没有,也能匹配。所以星号更多时候是用来测试那些可以省略的条件的。
+:重复1或者更多次

例子:

bash 复制代码
  const str = 'hello world';
  const reg = /hella+o/;
  const result = reg.test(str);
  console.log(result);

结果是false,因为原字符串里面并没有在hell后面跟着a的情况。如果改成

bash 复制代码
const reg = /hel+o/;

这次的结果就是true了。因为在he后面,跟随着不止1个l,符合了l+的条件。所以加号一般是用于那些不能省略的条件的。
?:重复0或1次

例子:

bash 复制代码
  const str = 'hello world';
  const reg = /hel?o/;
  const result = reg.test(str);
  console.log(result);

结果是false,因为我们所谓的量词,是跟随在需要出现的字符后面的,所以l?是一个整体,在原字符串里面,he后面跟随的是2个l,而l?的意思是0个或者1个l,所以并不匹配。

如果改成:

bash 复制代码
const reg = /hell?o/;

这样的结果就是true了, 因为hel后面有1个l,符合l?的条件。所以问号一般是用在需要精确到数量1的情况。
{n}:重复n次

例子:

bash 复制代码
  const str = 'hello world';
  const reg = /hel{2}o/;
  const result = reg.test(str);
  console.log(result);

结果是true,因为he后面跟随了2个l,刚好符合条件。

如果改成:

bash 复制代码
const reg = /hel{1}o/;

结果就是false了,因为数量对不上。
{n,}:重复n次或更多次

例子:

bash 复制代码
  const str = 'hellllo world';
  const reg = /hel{2,}o/;
  const result = reg.test(str);
  console.log(result);

结果是true,留意这次的原字符串已经被改了,he后面跟着4个l,所以我匹配的是l大于等于2次,都是符合的。
{n,m}:重复n次到m次

例子:

bash 复制代码
  const str = 'hello world';
  const reg = /hel{2,4}o/;
  const result = reg.test(str);
  console.log(result);

结果是true,因为我匹配的数量是he后面有2-4个l,原字符串里面he后面有2个l,符合条件。

3. 字符类

(1) 字符集合

可以使用中括号把一部分待选的字符放在一起,起到集合的作用,比如:

bash 复制代码
  const str = 'hello world';
  const reg = /hel[abclmn]o/;
  const result = reg.test(str);
  console.log(result);

结果是true,因为[abclmn]代表的含义是只要在这里面出现其中一个字符,都是符合的。

数字集合可以和量词一起使用,比如:

bash 复制代码
const reg = /wo[rl]+d/;

把条件改成这样之后,只需要在wo后面跟随的是有rl其中一个字母大于1个再接上字母d,都认为是通过。

(2) 连接符

在字符集合里面,通过添加符号-,达到代表一个范围的字符的作用,比如:
[a- z]:小写字母
[A- Z]:大写字母
[0-9]:数字。

举例:

bash 复制代码
  const str = 'abcdeFGHIJ12345';
  const reg = /[a-z]+[A-Z]+[0-9]+/;
  const result = reg.test(str);
  console.log(result);

结果是true,因为匹配的内容是前面一段小写字母,中间一段大写字母,后面一段是数字。

(3) 取反符

例子:

bash 复制代码
  const str = 'hello world';
  const reg = /[^a]+/;
  const result = reg.test(str);
  console.log(result);

结果是true,意思是只要原字符串里面没有字母a,就符合。

需要注意的是,这里的是写在中括号里面的,和之前的位置边界符代表开始的是不一样的。取反符也可以和一个集合一起使用,比如:

bash 复制代码
const reg = /[^0-9]+/;

这里的结果也是true,因为只要没有数字在原字符串里面,就符合了。

(4) .符

这个点符号可以代表除了换行符以外的任意单个字符。比如:

bash 复制代码
  const str = 'hello world';
  const reg = /h...o/;
  const result = reg.test(str);
  console.log(result);

这里的结果也是true,因为在h和o之间可以有3个除了换行符以外的任意符号。

点符号也可以和其他量词一起使用,比如:

bash 复制代码
const reg = /h.+o/;

这里代表的是,只要h和o之间有除了换行符以外的任意字符,不论数量,都可以匹配到。

三、 预定义

在正则表达式里面,有一些预先设定了含义的写法:
\d:相当于[0-9],代表所有的数字
\D:相当于[^0-9],代表的是除了数字以外的所有字符
\w:相当于[A-Za-z0-9],代表所有的字母和数字
\W:相当于[^A-Za-z0-9],代表了除了字母和数字以外的所有字符
\s:相当于[\t\r\n\v\f],代表了匹配空格类符号,包括制表符、换行符这些可以被trim删掉的特殊字符
\S:相当于[^\t\r\n\v\f],代表匹配非空的字符

所以如果条件写成:

bash 复制代码
const reg = /[\d\D]+/;

那么基本上可以匹配所有非空字符串了

四、 修饰符

修饰符的作用是约束正则执行的某些细节行为,比如是否区分大小写,是否支持多行匹配等。

写法:

bash 复制代码
/表达式/修饰符

1、 忽略大小写

i, 字母不区分大小写。

比如:

bash 复制代码
  const str = 'Hello world';
  const reg = /hello/;
  const result = reg.test(str);
  console.log(result);

这时候的结果是false,因为原字符串的H是大写的,而条件里面的h是小写的。

如果改成:

bash 复制代码
const reg = /hello/i;

这时候结果是true,因为i代表了忽略大小写,所以不论h是大写还是小写,都符合要求。

2、 匹配所有满足正则表达式的结果

正常的情况下,正则只会匹配第一个符合的结果,如果加上修饰符g,就可以变成匹配所有符合的条件。

这个一般是用于字符串替换里面的,比如:

bash 复制代码
  const str = 'Hello world';
  const reg = /l/;
  const result = str.replace(reg, 'L')
  console.log(result);

这时候结果是:

会发现,只有第一个l被替换成了大写。

如果把条件改成:

bash 复制代码
  const reg = /l/g;

结果是:

所有的l都被替换成大写的L了。

相关推荐
Gorgous—l23 分钟前
数据结构算法学习:LeetCode热题100-动态规划篇(下)(单词拆分、最长递增子序列、乘积最大子数组、分割等和子集、最长有效括号)
数据结构·学习·算法
摘星编程25 分钟前
React Native for OpenHarmony 实战:Picker 选择器组件详解
javascript·react native·react.js
摘星编程1 小时前
React Native for OpenHarmony 实战:VirtualizedList 虚拟化列表
javascript·react native·react.js
摘星编程1 小时前
React Native for OpenHarmony 实战:RefreshControl 下拉刷新组件
javascript·react native·react.js
窗边鸟2 小时前
小白日记之java方法(java复习)
java·学习
burning_maple2 小时前
redis笔记
数据库·redis·笔记
魔芋红茶2 小时前
Spring Security 学习笔记 4:用户/密码认证
笔记·学习·spring
googleccsdn2 小时前
ENSP Pro Lab笔记:配置BGP VXLAN双栈(3)
网络·笔记
爱宁~3 小时前
UnityShader学习笔记[二百九十九]UGUI中的Mask遮罩半透明Shader
笔记·学习
鸣弦artha3 小时前
Flutter框架跨平台鸿蒙开发——Extension扩展方法
android·javascript·flutter