资讯专栏INFORMATION COLUMN

JS中的正则表达式

Soarkey / 512人阅读

摘要:构造函数可以有两个字符串参数,第一个参数包含正则表达式的主体部分。只读的布尔值,说明这个正则表达式是否带有修饰符。中正则的扩展构造函数在中,只能接受字符串作为参数,允许其直接接受正则表达式作为参数。

上文传送门:初探正则表达式

正则表达式是一个描述字符模式的对象,JavaScriptRegExp 类表示正则表达式,StringRegExp 都定义了方法,后者使用正则表达式进行强大的模式匹配和文本检索于替换功能。JavaScript 的正则表达式语法是 Perl5 的正则表达式语法的子集。

JS中正则表达式的定义

JavaScript 中的正则表达式用RegWxp对象表示,可以使用RegExp()构造函数来创建RegExp对象,不过RegExp对象更多的是通过一种特殊的直接量语法来创建。就像通过引号包裹字符的方式来定义字符串直接量一样,正则表达式直接量定义为包含在一对斜杠(/)之间的字符,比如:

var someReg  = /s$/ 
var someReg2 = new RegExp("s$")

其实,这两个表达式是等价的,都匹配以字母s结尾的字符串,只不过第一个以直接量定义,第二个以正则表达式定义。

js中正则表达式的修饰符
修饰符 说明
i 执行不区分大小写的匹配
g 执行一个全局匹配,即找到所有匹配而不是找到一个就停止
m 多行匹配模式 ^ 匹配一行的开头和字符串的开头 $ 匹配行的结束和字符串的结束
用于匹配模式的String方法

String 支持4种使用正则表达式的方法。

1. search()

"JavaScript".search(/script/i);

search() 的参数是一个正则表达式,返回第一个与之匹配的字串的起始位置,如果到不到匹配的字串,它将返回 -1,如果它的参数不是正则表达式,则首先会通过RegExp构造函数将他转化成正则表达式,它不支持全局搜索,因为它忽略正则表达式中的修饰符 g。上面的表达式将返回 4

2. replace()

text.replace(/javascript/gi, "JavaScript");

replace() 用来执行检索和替换操作。其中第一个参数是一个正则表达式,第二个参数是要进行替换操作的字符串。这个方法会对调用它的字符串进行检索,使用指定的模式来匹配。如果 replace() 的第一个参数是一个字符串,那么它将直接搜索这个字符串,而不是和 search() 一样先通过 RegExp()将它转换成正则表达式。上面的表达式将文本中所有的 javascript (不区分大小写)统一替换为 JavaScript

3. march():

"1 and 2 and 3".match(/d+g);

match() 方法是最常用的String正则表达式方法。它唯一的参数就是一个正则表达式,返回的是一个匹配结果组成的数组。如果该表达式设置了修饰符 g,则该方法反悔的数组中包括了字符串中所有匹配结果。如果这个这个正则表达式没有设置修饰符 g,它只检索第一个匹配。但是即使它不是全局匹配,它也返回一个数组,在这种情况下,数组的第一个元素就是匹配的字符串,剩下的元素则是正则表达式中用圆括号扩起来的子表达式。上面代码返回 ["1","2","3"]

4. split()

"123,456,789".split(",");

这个方法将调用他的字符串拆分成一个字串组成的数组,使用的分隔符是 split() 的参数,它的参数也可以是一个正则表达式。上面的代码返回 ["123","456","789"]

RegExp对象

除了 RegExp() 构造函数以外,RegExp 对象还支持三个方法和一些属性。

RegExp()构造函数可以有两个字符串参数,第一个参数包含正则表达式的主体部分。需要注意的是不管是字符串直接量还是正则表达式,都是用 作为转义字符的前缀,因此当给构造函数传入一个字符串表述的正则表达式时,必须要将 替换成 。如果提供第二个参数,它就制定正则表达式的修饰符。

var thisReg = new RegExp("d{5}","g");

RegExp的属性

source: 只读的字符串,包含正则表达式的文本。

global: 只读的布尔值,说明这个正则表达式是否带有修饰符 g

ignoreCase: 只读的布尔值,说明这个正则表达式是否带有修饰符 i

multiline: 只读的布尔值,说明这个正则表达式是否带有修饰符 m

lastIndex: 可读写的整数,如果这个正则表达式带有修饰符 g ,这个属性储存在整个字符串中下次检索的开始位置,这个属性会被 exec()test() 方法用到。

RegExp的方法

RegExp对象定义了两个用于执行模式匹配操作的方法。

1. exec()

它与我们之前介绍的 match() 相似,只是它的参数是一个字符串,而 match() 的参数是一个RegExp对象。

exec() 对一个指定的字符串执行匹配检索。如果它没有找点任何匹配,它就返回 null,但是如果他找到一个匹配,它将返回一个数组,这个数组第一个元素包含的是与正则表达式相匹配的字符串,余下的就是正则表达式括号内的子表达式。

match() 不同,不管正则表达式是否具有全局修饰符 gexec() 都会返回一样的数组。当调用 exec() 的正则表达式对象具有修饰符 g 的时候,它把当前正则表达式的 lastindex 属性设置为紧挨着匹配字串的字符位置。当同一个字符串第二次调用 exec() 的时候,他将会从 lastIndex 所指示的字符位置开始检索。如果没有任何匹配结果,他将会把 lastIndex 设置为 0(我们也可以在任何时候进行设置)。

2. test()

调用 test() 和调用 exec() 等价,当 exec() 的返回结果不是 null 的时候,test() 返回 true。由于这种等价性,当一个全局表达式调用 test() 时,它的行为和 exec() 一样。

ES6中正则的扩展 RegExp构造函数

在ES5中,RegExp() 只能接受字符串作为参数,ES6允许其直接接受正则表达式作为参数。

let regex = new RegExp(/xyz/i)

字符串的正则方法

ES6中将字符串对象的4个正则方法在语言内部全部调用 RegExp 的实例方法,使得所有与正则有关的方法全部都定义在了 RegExp 对象上。

String.prototype.match 调用 RegExp.prototype[Symbol.match]

u修饰符

ES6对正则表达式增加了 u 修饰符,含义为“Unicode模式”,用来正确处理大于 uFFFF 的Unicode字符。

y修饰符

ES6还为正则表达式添加了 y 修饰符。他的作用和 g 修饰符类似,也是全局匹配,后一次匹配都从上一次匹配成功的下一位置开始。不同之处在于,g 修饰符只要剩余位置中存在匹配就行,而 y 修饰符会确保匹配从剩余的第一个位置开始。g 修饰符会忽略非法字符, y 不会。

let s  = "aaa_aa_a";
let r1 = /a+/g;
let r2 = /a+/y;

r1.exec(s)  // ["aaa"]
r2.exec(s)  // ["aaa"]

r1.exec(s)  // ["aa"]
r2.exec(s)  // null
sticky属性

y 修饰符对应,ES6的正则对象对了 sticky 属性,用来表示是否设置了 y 修饰符。

flags属性

ES6为正则表达式新增了 flags 属性,返回正则表达式的修饰符。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/95028.html

相关文章

  • 正则JS中的正则

    摘要:注意本文将正则与中的正则分开讨论。正则零宽断言更多参考各种语言对于正则不同支持参考单行模式与多行模式通过设置正则表达式后的修饰符可开启对应的匹配模式单行模式和多行模式。 最近这段时间帮同学处理一些文档, 涉及到一些结构化文档的工作大部分都得使用正则表达式, 之前对于正则的认识大多来源于语言书上那几页的介绍, 自己也没有用过几次。这里将我之前感到模糊的概念作个整理。因为对JS了解多点,所...

    firim 评论0 收藏0
  • JS正则达式一条龙讲解,从原理和语法到JS正则、ES6正则扩展,最后再到正则实践思路

    摘要:控制权和传动这两个词可能在搜一些博文或者资料的时候会遇到,这里做一个解释先控制权是指哪一个正则子表达式可能为一个普通字符元字符或元字符序列组成在匹配字符串,那么控制权就在哪。 温馨提示:文章很长很长,保持耐心,必要时可以跳着看,当然用来查也是不错的。 正则啊,就像一座灯塔,当你在字符串的海洋不知所措的时候,总能给你一点思路;正则啊,就像一台验钞机,在你不知道用户提交的钞票真假的时候,...

    Michael_Lin 评论0 收藏0
  • JS正则达式元字符

    摘要:表示非单词字符,等效于正则教程返回完整的字符串,因为,中文算作是非单词字符。行首行尾,修饰符形式修饰符的作用是修改和在正则表达式中的作用,让它们分别表示行首和行尾。 正则 描述 正则 描述 f 匹配换页符 匹配制表符 匹配换行符 v 匹配垂直制表符 匹配回车 s 匹配单个空格,等同于[f v]; S...

    CODING 评论0 收藏0
  • 正则达式

    摘要:最全正则表达式总结验证号手机号中文邮编身份证地址等是正则表达式的缩写,作用是对字符串执行模式匹配。学习目标了解正则表达式语法在中使用正则表达式在中使 JS高级技巧 本篇是看的《JS高级程序设计》第23章《高级技巧》做的读书分享。本篇按照书里的思路根据自己的理解和经验,进行扩展延伸,同时指出书里的一些问题。将会讨论安全的类型检测、惰性载入函数、冻结对象、定时器等话题。1. 安全的类型检测...

    yibinnn 评论0 收藏0
  • js正则达式学习笔记

    摘要:说来惭愧,做前端快三年对于正则表达式的应用还是很浅薄,大家都知道正则的速度基本上是最快的,但就是懒得去记那些语法和规则,这次项目中多次用到了需要匹配替换的动作,终于下定决心去研究一下了。 说来惭愧,做前端快三年对于正则表达式的应用还是很浅薄,大家都知道正则的速度基本上是最快的,但就是懒得去记那些语法和规则,这次项目中多次用到了需要匹配替换的动作,终于下定决心去研究一下了。 实例化正则对...

    Towers 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<