| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> JavaScript知识库 -> JavaScript中的正则表达式 -> 正文阅读 |
|
[JavaScript知识库]JavaScript中的正则表达式 |
正则表达式
两种创建形式基本形式(字面量)正则表达式内容用一对斜杠包裹
使用构造函数创建正则表达式
脚本加载后正则表达式字面量就会被编译,当正则表达式不变时,使用字面量可获得更好的性能;在脚本运行过程中编译用构造函数创建的正则表达式,如果正则表达式会动态变化,那么就需要使用构造函数来创建正则表达式 正则表达式中的自变量使用模板字符串的变量拼接将变量代入
正则表达式的模式匹配简单的模式(字面值)由基本字符组成,这些字符直接匹配字符内容(相同的字符及顺序)
特殊字符利用特殊字符可以构造一些特别的模式匹配,而不仅仅只是匹配固定的基本字符内容,比如匹配不定个数的 反斜杠
|
Flag | Desc | Corresponding prop |
---|---|---|
d | 为匹配子串生成开头和结尾的索引,索引通过 RegExpArray 的 indices 数组获得 | RegExp.prototype.hasIndices |
g | 全局搜索。对于String相关方法意味着在整个字符串中搜索,对于RegExp相关方法意味着获得迭代进程,也就是多次调用相关方法会迭代的向前寻找字符串中匹配子串 | RegExp.prototype.global |
i | 忽略大小写地进行搜索 | RegExp.prototype.ignoreCase |
m | 多行搜索,这意味着在包含多个行的字符串中使用断言符号^ 和$ 时,会匹配每行的开头和结尾,而不是默认的只匹配整个字符串的开头和结尾 | RegExp.prototype.multiline |
s | 允许. 匹配换行符 | RegExp.prototype.dotAll |
u | “unicode”,意味着将模式视为一系列的unicode代码点 | RegExp.prototype.unicode |
y | 进行粘性搜索,也就是开始搜索的下标由正则表达式对象的lastIndex属性决定 | RegExp.prototype.sticky |
以上所有标志位对应的对应RegExp的属性都是只读属性(布尔值)
主要是在RegExp的方法和String的几个允许使用正则表达式参数的方法中使用
整个方法会执行一次在指定字符串中的匹配搜索,返回一个结果数组(RegExpArray,是一个伪数组,包含多个属性)或null
通过方法参数传入需要进行搜索匹配的字符串
当正则表达式的标志位包含g
或y
时,正则表达式对象是有状态的。这个状态由正则表达式对象的属性lastIndex
记录,这个属性表示的是下一个匹配搜索的开始索引。接下来每执行一次exec()
,就会改变一次lastIndex
,这样每次搜索都会从新的位置开始搜索,直到字符串搜索结束(返回null),再调用exec()
就会从头开始
这里要注意,当多次执行exec()
时,如果中途目标字符串改变了,lastIndex
也不会归 0 (除非返回 null),此时就会出错
当执行一次exec()
匹配成功时,将会返回一个RegExpArray
,是一个包含额外属性的数组,当匹配成功一次就会更新一次RegExp对象的lastIndex
属性;如果匹配失败则返回null
,并且lastIndex
置为 0
返回的RegExpArray
将完整正则表达式的匹配项作为数组第一个元素[0]
,接下来的数组元素是各个捕获分组的匹配项(与捕获分组左括号出现的顺序一致)。数组包含的额外属性有:
d
后,会记录匹配项的起始和终止索引,是一个二维数组,其中的每个一维数组存储一对起始和终止索引。其中也有一个groups
属性,记录了具名捕获分组的匹配项起始和终止索引该方法用于判断字符串中是否存在完整正则表达式的匹配项,返回布尔值
和exec()
类似,当正则表达式设置了标志位g
或y
,当方法执行一次,就会搜索一次匹配项,此时RegExp对象的属性lastIndex
也会更新,并且如果中途目标字符串换了,lastIndex
也不会归 0 ,除非返回 false
根据传入的正则表达式参数来在字符串中检索匹配项,返回一个含有匹配项的数组或者null
;如果不传入任何参数,将会获得一个含有一个空字符串的数组
当传入的参数不是一个RegExp
对象类型,将会隐式地使用new RegExp()
把它转化为RegExp
对象,并且注意如果传入的是一个带符号的正数,其中的+
会被省略掉,比如+10086
最后形成的正则表达式为/10086/
当无匹配项时返回null
,当有匹配项时返回的内容取决于是否设置了标志位g
如果设置了标志位g
,则会返回所有和完整正则表达式的匹配项,并不包括捕获分组的匹配项
如果没有设置标志位g
,则返回结果和执行RegExp.prototype.exec(str)
不设置g
时返回结果一致,也就是返回一个带有额外属性、包含第一个完整正则表达式的匹配项以及捕获分组匹配项的数组
返回一个含有所有匹配结果的迭代器,这是一个不能重新开始迭代过程的迭代器,迭代器每次迭代返回的数据是一个RegExpArray
(和RegExp.prototype.exec()
返回值类型相同)
g
标志位的正则表达式对象(如果为含有g
标志位的正则表达式字符串,将会自动转化为RegExp对象),如果不含g
将会抛出错误TypeError
matchAll()
方法前,对于设置了g
的正则表达式需要使用RegExp.prototype.exec()
和循环语句来获取所有的匹配项及其具体信息(包括捕获分组匹配项、起始索引等信息),现在利用matchAll()
方法返回的迭代器可以利用for...of...
结构、Array.from()
或扩展运算符...
来简练地获取所有内容matchAll()
方法会在执行时内部创建一个传入的正则表达式对象的克隆,这使得原有的正则表达式对象的lastIndex
参数不会被改变(这和exec()
不一样,该方法会执行一次就更新一次lastIndex
)matchAll()
和match()
相比较的一个优点就是能够更好地获取捕获分组的信息。如上文所说match()
中的正则表达式设置g
标志位时只能获取到第一个匹配到的内容,那么只可以获取到第一个完整正则表达式匹配项的捕获分组相关信息,但使用matchAll()
则可以通过返回的迭代器获取所有匹配项的捕获分组信息在字符串中执行一次匹配项搜索
找到完整正则表达式的匹配项则返回匹配项起始索引,否则返回 -1
返回一个匹配项被替换后的新字符串,原字符串不会被改变
这个方法的参数还可以是replace(substr, newSubstr|replacerFunction)
,此时第一个参数为一个字符串,并且只有目标字符串中第一个匹配substr
的子串才会被替换
在这里主要讨论第一个参数为regexp
的情况,此时第一个参数一定不能为字符串形式的正则表达式(此时不会被解析为正则表达式),必须为正则表达式对象或者字面量的正则表达式(比如只能为RegExp(/abc/)
或/abc/
,但不能为"/abc/"
)。当正则表达式设置了标志位g
则会替换所有完整正则表达式匹配项
第二个参数可以为一个用于替换完整正则表达式匹配项的字符串或者一个函数(生成用于替换完整正则表达式匹配项的字符串)
当为用于替换的字符串时,可以为一个简单的字符串,也可以为一些特定的变量
注意以下的变量都要用引号包裹起来
Pattern | Inserts |
---|---|
$$ | 插入一个$ |
$& | 插入完整正则表达式匹配到的子串 |
$` | 插入完整正则表达式匹配到的子串之前的字符串原有内容 |
$’ | 插入完整正则表达式匹配到的子串之后的字符串原有内容 |
$n | n 是一个正整数且小于100,用于插入第 n 个捕获分组的匹配项,如果对应的内容不存在或第一个参数不为RegExp 对象,则将被解析为字面量$n |
$<name> | name 表示的是具名捕获分组的名称,$<name> 为对应捕获分组的匹配项。如果对应名称没有对应内容或者第一个参数不为RegExp ,又或者这个名称并不存在,则将被解析为字面量$<name> |
当为一个函数时,这个函数会在匹配操作执行完之后执行,返回的是用于替换的字符串。如果第一个参数是设置了标志位g
的RegExp对象,则该函数会被执行多次,以此替换多个完整正则表达式匹配项
函数有以下参数:
Possible name | Supplied value |
---|---|
match | 完整正则表达式匹配到的子串,对应$& |
p1, p2, … | 第 n 个捕获分组的匹配项,对应$n |
offset | 当前匹配项的起始索引,或者说起始位置在整个字符串中的位移 |
string | 被进行匹配搜索的字符串,也就是调用该方法的字符串 |
groups | 一个键为具名捕获分组名称、值为分组对应匹配项的对象 |
当没有设置第二个参数空字符串时,匹配项会被移除
replaceAll()
和replace()
的区别在于前者会替换所有的匹配项,并且要求如果第一个参数为RegExp
,则必须设置标志位g
,否则会抛出TypeError
用于根据特定符号分割字符串,返回一个存有分割后子串的数组
如果字符串为空字符串,那么就返回一个含有一个空字符串的数组;
如果字符串和分隔符都是空字符串,则返回一个空数组;
如果匹配不到分隔符或没有传入分隔符则返回含有一整个字符串的数组;
如果正常匹配则返回含有匹配子串的数组
split("")
将字符串解析成字符数组的问题此时是通过UTF-16的字符单元分割,这样会破坏代理对(surrogate pairs),如果字符串中有特殊字符可能会导致分割后字符为乱码。代理对被破坏是指部分字符它的字符编码并不是只对应了一个字符单元,而是两个(成一对,一个前导一个后缀),而通过这种方式的分割会使一个字符的两个字符单元变成分割两个独立字符放入数组,导致返回的结果出现乱码
所以如果想要将一个字符串变成一个字符数组,可以使用扩展运算符...
str,数组方法Array.from(str)
,又或者使用str.split(/(?=[\s\S])/u)或str.split(/(?=.)/us)
(实际用了先行断言x(?=y)
,此时x
为空字符串""
),又或者将字符通过循环一个一个的放入一个新的数组中
当使用RexExp相关方法时会改变RexExp对象实例的相关属性
d
后,会记录匹配项的起始和终止索引,是一个二维数组,其中的每个一维数组存储一对起始和终止索引。其中也有一个groups
属性,记录了具名捕获分组的匹配项起始和终止索引https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions
|
JavaScript知识库 最新文章 |
ES6的相关知识点 |
react 函数式组件 & react其他一些总结 |
Vue基础超详细 |
前端JS也可以连点成线(Vue中运用 AntVG6) |
Vue事件处理的基本使用 |
Vue后台项目的记录 (一) |
前后端分离vue跨域,devServer配置proxy代理 |
TypeScript |
初识vuex |
vue项目安装包指令收集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/27 4:45:53- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |