博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
js红宝书总结-正则表达式
阅读量:7083 次
发布时间:2019-06-28

本文共 3771 字,大约阅读时间需要 12 分钟。

RegExp类型

es通过RegExp类型支持正则

  • 字面量定义法:
var expression = /pattern/flags;复制代码
  • pattern(模式)可包含字符类、限定符、分组(()围起来的部分)、向前查找以及反向引用。每个正则表达式都可带有==一或多个标志==(flags)
    • g:全局模式,即模式将被应用于所有字符串,而非在发现第一个匹配项时立即停止
    • i:表示不区分大小写模式,即在确定匹配项时忽略模式与字符串的大小写
    • m:表示多行模式(不知道这到底是什么模式,和全局有啥区别。。。书上也没案例)
var pattern1 = /at/g;//匹配所有“at”的实例var pattern2 = /[bc]at/i;//匹配第一个“bat”或“cat”,不区分大小写var pattern3 = /.at/gi;//匹配所有以“at”结尾的3个字符的组合、不区分大小写复制代码
  • 所有==元字符==必须转义: ([{^$|?*+.}])等

var pattern1 = /[bc]at/i;//匹配第一个“bat”或“cat”,不区分大小写var pattern2 = /\[bc\]at/i;//匹配第一个“[bc]at”,不区分大小写var pattern3 = /\.at/gi;//匹配所有“.at”,不区分大小写复制代码
  • RegExp构造函数

接收两个参数:一个是要匹配的字符串模式,另一个是可选的标志字符串。字面量定义的任何表达式,都可以使用构造函数来定义

var pattern1 = /[bc]at/i;var pattern2 = new RegExp("[bc]at","i");复制代码
  • 不能把正则表达式字面量传递给RegExp构造函数。因为RegExp接收的都是字符串,所以某些情况要对字符进行双重转义,==所有元字符都必须双重转义==,已转义的字符也要如此

* 说下字符“\”:在正则表达式的字符串里,他的转义是要参考其作用的: 1. 作为元字符(转义或者\d,\n之类)。那么字面量模式里他是一个“\”,到正则表达式字符串里,就是两个“\” 2. 作为字符串。那么字面量模式里他是两个“\”,到正则表达式字符串里,就是四个“\”

RegExp实例属性

每个RegExp实例都有如下属性:

  • global:boolean,表示是否设置了g标志

  • ignoreCase:boolean,表示是否设置了i标志

  • ==lastIndex:number,表示开始搜索下一个匹配项的字符位置,从0算起==

  • multiline:boolean,表示是否设置了m标志

  • ==source:正则表达式的字符串表示,按照字面量形式而非传入构造函数中的字符串模式返回==

var pattern1 = /\[bc\]at/i;alert(pattern1.lastIndex);//0alert(pattern1.source);//"\[bc\]at"var pattern2 = new RegExp("\\[bc\\]at","i");alert(pattern2.lastIndex);//0alert(pattern2.source);//"\[bc\]at"复制代码

source所存都是字面量形式的字符串

RegExp实例方法

exec

  • exec():exec()接受一个参数,即要查询的字符串,然后返回包含第一个匹配项信息的数组;没有匹配项时,返回null。

  • 返回的数组虽然是Array的实例,但包含两个额外的属性:index和input。其中,index表示匹配项在字符串中的位置,input表示查询的字符串(exec接受的参数)

  • 在数组中,第一项是与整个模式匹配的字符串,其他项是与模式中的捕获组匹配的字符串。无捕获组则该数组只包含一项。(括号包含的就是捕获组)

捕获组就是把正则表达式中子表达式匹配的内容,保存到内存中以数字编号或显式命名的组里,方便后面引用。当然,这种引用既可以是在正则表达式内部,也可以是在正则表达式外部。一般一个小括号括起来就是一个捕获组。捕获组可以进行嵌套。以深度优先进行编号,在js中编号从1开始。

var text = "mom and dad and baby";var pattern = /mom( and dad( and baby)?)?/gi;var matches = pattern.exec(text);alert(matches.index);//0alert(matches.input);//"mom and dad and baby"alert(matches[0]);//"mom and dad and baby"alert(matches[1]);//" and dad and baby"alert(matches[2]);//" and baby"复制代码

捕获组有两个: and dad and baby; and baby

  • 不设置g时,同一字符串上多次调用exec()将始终返回第一个匹配项的信息。设置g时,每次调用exec都会在字符串中继续查找新匹配项;即使设置了g,exec每次也只返回一个匹配项
var text = "cat, bat, sat, fat";var pattern1 = /.at/;var matches = pattern1.exec(text);alert(matches.index);//0alert(matches[0]);//catalert(pattern1.lastIndex);//0matches = pattern1.exec(text);alert(matches.index);//0alert(matches[0]);//catalert(pattern1.lastIndex);//0 (lastIndex:表示开始搜索下一个匹配项的字符位置。一直为0所以始终返回第一个匹配项的信息)var pattern2 = /.at/g;var matches = pattern2.exec(text);alert(matches.index); //0alert(matches[0]);//catalert(pattern2.lastIndex);//3复制代码
  • g模式下,lastIndex在每次调用exec()后都会增加,而在非全局模式下始终保持不变

test

  • 接受一个字符串参数,模式与该参数匹配的情况下返回true;否则返回false
var text = "000-00-0000";var pattern = /\d{3}-\d{2}-\d{4}/;if(pattern.test(text)){    alert("The pattern was matched.");}复制代码

toLocaleString()、toString()、valueOf()

  • 这三个方法继承自Object。前两者都会返回==正则表达式的字面量==,与创建正则表达式的方式无关
var pattern = new RegExp("\\[bc\\]at","gi");alert(pattern.toString());// /\[bc\]at/gialert(pattern.toLocaleString());// /\[bc\]at/gi复制代码
  • 第三个方法则是返回正则表达式本身:

RegExp构造函数的属性

  • 构造函数所带的属性,适用于作用域中的所有正则表达式。并基于所执行的最近一次正则表达式操作而变化

  • 这些属性可以通过两种方式访问

var text = "this has been a short summer";var pattern = /(.)hort/g;if(pattern.test(text)){    alert(RegExp.input);//this has been a short summer    alert(RegExp.leftContext);//this has been a     alert(RegExp.rightContext);// summer    alert(RegExp.lastMatch);//short    alert(RegExp.lastParen);//s    alert(RegExp.multiline);//false}复制代码
  • 如果要使用短属性名,则需要通过方括号语法来访问(因为大都不是有效的es标识符)

  • 构造函数属性里还有9个用于存储捕获组,分别为RegExp.$1、RegExp.$2...

  • 调用exec()或test()方法时,$1等属性会被自动填充

var text = "this has been a short summer";var pattern = /(..)or(.)/g;if(pattern.test(text)){    alert(RegExp.$1);//sh    alert(RegExp.$2)l//t}复制代码

模式的局限性

以下是es正则表达式不支持的特性:

转载地址:http://sbqml.baihongyu.com/

你可能感兴趣的文章
ionic2 textarea Automatically grows
查看>>
Android手机拨打电话的开发实例
查看>>
个人关于面试的一些总结
查看>>
阿里云短信服务接口触发天级流控Permits:10
查看>>
2、hibernate的 save 保存失败的解决方法
查看>>
linux -- Ubuntu 命令技巧合集
查看>>
ANT无线通信技术(1) 简介
查看>>
struts2
查看>>
linux的几个常用命令
查看>>
第一个UG练习
查看>>
黄聪:php计算获取页面执行时间
查看>>
iOS 三种定时器
查看>>
[状压DP][二分]JZOJ 3521 道路覆盖
查看>>
【错误】 “=” 与 "==" 不分
查看>>
Java技术回顾之JNDI:命名和目录服务基本概念(转)
查看>>
0622 总结与回顾
查看>>
[转]SharePoint 2010 Download as Zip File Custom Ribbon Action
查看>>
getprop 获取android系统属性
查看>>
【C++】traits classes
查看>>
jquery实现的3D缩略图悬停效果
查看>>