JavaScript 正则表达式学习整理

1. 创建

在 JavaScript 中,可以通过两种方式创建一个正则表达式。

(1)通过调用 RegExp 对象的构造函数创建

const regexp = new RegExp(正则表达式, 标志);

(2)利用字面量创建正则表达式

const rg = /正则表达式/[可选的标志];

2. 标志

标志描述
g全局搜索
i不区分大小写搜索
m多行搜索
s允许 . 匹配换行符
u使用unicode码的模式进行匹配
y执行**粘性(sticky)**搜索,匹配从目标字符串的当前位置开始

3. 字符

一个正则表达式可以由简单的字符构成,比如 /abc/,也可以是简单和特殊字符的组合,比如 /ab*c/ 。其中特殊字符也被称为元字符,在正则表达式中是具有特殊意义的专用符号,如 ^$+ 等。

特殊字符非常多,可参考:[MDN]

1. 断言

1. 边界类断言

(1)^

匹配输入的开头。如果多行模式设为 true,在换行符后也能立即匹配。

^ 出现在集合范围开头时的含义与此不同。

(2)$

匹配输入的结束。如果多行模式设为 true,在换行符前也能立即匹配。

(3)\b

匹配一个单词的边界。

const reg1 = /\b/g;
const reg2 = /xx\b/g;
const reg3 = /\bs/g;
const str = 'sdfxx sfadf';

const arr1 = str.match(reg1); // [ '', '', '', '' ]  两个单词,一共四个边界
const arr2 = str.match(reg2); // [ 'xx' ]  以xx结尾
const arr3 = str.match(reg3); // [ 's', 's' ]  以s开头

(4)\B

匹配非单词边界。

例如,/xx\B/匹配非xx结尾,/\Bs/匹配非s开头。

2. 其他断言

(1)x(?=y)

向前断言xy跟随时匹配x

例如,对于/Jack(?=Sprat)/Jack在跟有Sprat的情况下才会得到匹配。

/Jack(?=Sprat|Frost)/Jack后跟有SpratFrost的情况下才会得到匹配。

不过,匹配结果不包括SpratFrost

(2)x(?!y)

向前否定断言x没有y紧随时匹配x

例如,对于/\d+(?!\.)/,数字后没有跟随小数点的情况下才会得到匹配。

/\d+(?!\.)/.exec(3.141),匹配141而不是3

(3)(?<=y)x

向后断言x跟随y的情况下匹配x

例如,对于/(?<=Jack)Sprat/Sprat紧随Jack时才会得到匹配。

/(?<=Jack|Tom)SpratSprat在紧随JackTom的情况下才会得到匹配。不过,匹配结果中不包括JackTom

(4)(?<!y)x

向后否定断言x不跟随y时匹配x

例如,对于/(?<!-)\d+/,数字不紧随-符号的情况下才会得到匹配。

/(?<!-)\d+/.exec(3)3得到匹配。

/(?<!-)\d+/.exec(-3)的结果无匹配,这是由于数字之前有-符号。

2. 字符类

(1).

  • 匹配除行终止符之外的任何单个字符
  • 在字符集内,.失去了它的特殊意义,并与文字点匹配

(2)\d

匹配任何数字,相当于[0-9]

(3)\D

匹配任何非数字,相当于[^0-9]

(4)\w

匹配字母+数字+下划线,相当于[A-Za-z0-9_]

(5)\W

匹配字母+数字+下划线以外的字符,相当于[^A-Za-z0-9_]

(6)\s

匹配任意一个空格(包括换行符制表符空格符等),相当于[\t\r\n\v\f]

(7)\S

匹配任意一个非空格符,相当于[^\t\r\n\v\f]

(8)\t\r\n\v\f

符号说明
\t匹配一个制表符。等价于\x09\cI
\r匹配一个回车符。等价于\x0d\cM
\n匹配一个换行符。等价于\x0a\cJ
\v匹配一个垂直制表符。等价于\x0b\cK
\f匹配一个换页符。等价于\x0c\cL

3. 组、范围

(1)x|y

匹配``xy`。

例如,/green|red/green apple里匹配green,且在red apple里匹配red

(2)[xyz][a-c]

字符集。 匹配任何一个包含的字符。可以使用连字符来指定字符范围,但如果连字符为方括号中的第一个最后一个字符,则它将被视为作为普通字符包含在字符集中的文字连字符。也可以在字符集中包含字符类。

例如,[abcd][a-d]等价。

[abcd-][-abcd]将会在brisket匹配b, 在chop匹配c,并且匹配non-profit中的-

[\w-][A-Za-z0-9_-]等价。

(3)[^xyz]

匹配任何没有包含在括号中的字符。

(4)(x)

捕获组:匹配x并记住匹配项。

例如,/(foo)/匹配并记住foo bar中的foo

(5)(?:x)

非捕获组:匹配x,但不记得匹配。

4. 量词

符号说明
x*重复0次或更多
x+重复1次或更多
x?重复0次或1
x{n}重复n
x{n,}重复n次或更多
x{n,m}重复nm
x*? x+? x?? x{n}? x{n,}? x{n,m}?默认情况,*+这样的量词是贪婪的,试图匹配尽可能多的字符串。加?使量词非贪婪:意思是它一旦找到匹配就会停止。

4. 常用方法

1. replace

replace()方法可以实现替换字符串操作,用来替换的参数可以是一个字符串或是一个正则表达式

str.replace(regexp/substr,replacement)
  • 第一个参数:被替换的字符串 或者 正则表达式
  • 第二个参数:替换为的字符串

返回值是一个替换完毕新字符串

2. test

test()法执行一个检索,查看正则表达式与指定的字符串是否匹配。

regexObj.test(str)

返回truefalse

const str = 'hello world!';
const result = /^hello/.test(str);
console.log(result); // true

3. match

match()方法检索返回一个字符串匹配正则表达式的结果。

str.match(regexp)

返回值:

  • 如果使用g标志,则将返回与完整正则表达式匹配的所有结果,但不返回捕获组
  • 如果未使用g标志,则仅返回第一个完整匹配及其相关的捕获组(Array)。 在这种情况下,返回的项目将具有如下所述的其他属性。
    • groups:一个捕获组数组或undefined
    • index:匹配的结果的开始位置
    • input:搜索的字符串

如果正则表达式不包含g标志,将返回与RegExp.exec()相同的结果。

4. matchAll

matchAll()方法返回一个包含所有匹配正则表达式的结果及分组捕获组迭代器

str.matchAll(regexp)

regexp必须是设置了全局模式g的形式,否则会抛出异常TypeError

5. search

search()方法执行正则表达式和字符串的搜索匹配。

str.search(regexp)

如果匹配成功,则search()返回正则表达式在字符串中首次匹配项的索引;否则,返回-1

6. split

split()方法使用指定的分隔符将字符串分割成子字符串数组

str.split([separator[, limit]])
  • separator:指定表示每个拆分应发生的点的字符串。可以是一个字符串或正则表达式
  • limit:可选,一个整数,限定返回的分割片段数量。

返回原字符串以分隔符出现位置分隔而成的数组。

7. exec

exec()方法在一个指定字符串中执行一个搜索匹配。

regexObj.exec(str)

如果匹配成功,返回一个数组(属性indexinput),并更新正则表达式对象的lastIndex属性。完全匹配成功的文本将作为返回数组的第一项,从第二项起,后续每项都对应正则表达式内捕获括号里匹配成功的文本。

如果匹配失败,返回null,并将lastIndex重置为0

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

火星飞鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值