美文网首页让前端飞我的日更计划每天写1000字
【JS基础】JavaScript引用类型之RegExp 类型

【JS基础】JavaScript引用类型之RegExp 类型

作者: 虹猫1992 | 来源:发表于2018-12-31 11:54 被阅读15次

ECMAScript 通过 RegExp 类型来支持正则表达式。

一、正则表达式的定义

  1. 通过字面量形式
var expression = / pattern / flags ; 

// 模式(pattern)部分可以是任何简单或复杂的正则表达式;
// 标志(flags)用以标明正则表达式的行为。

正则表达式的匹配模式支持下列 3 个标志:

  • g:表示全局模式,即模式将被应用于所有字符串,而非在发现第一个匹配项时立即 停止;
  • i:表示不区分大小写模式,即在确定匹配项时忽略模式与字符串的大小写;
  • m:表示多行模式,即在到达一行文本末尾时还会继续查找下一行中是否存在与模 式匹配的项。
// 匹配字符串中所有"at"的实例
var pattern1 = /at/g; 

// 匹配第一个"bat"或"cat",不区分大小写
var pattern2 = /[bc]at/i; 

// 匹配所有以"at"结尾的 3 个字符的组合,不区分大小写
var pattern3 = /.at/gi; 
  1. 使用 RegExp 构造函数

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

注意:传递给 RegExp构造函数的两个参数都是字符串(不能把正则表达式字面量传递给 RegExp 构造函数)

// 匹配第一个"bat"或"cat",不区分大小写
var pattern1 = /[bc]at/i; 

// 与 pattern1 相同,只不过是使用构造函数创建的
var pattern2 = new RegExp("[bc]at", "i"); 

ECMAScript 5 明确规定,使用正则表达式字面量必须像直接调用 RegExp 构造函数一样,每次都创建新的 RegExp 实例

二、RegExp实例属性

RegExp 的每个实例都具有下列属性,通过这些属性可以取得有关模式的各种信息:

  • global:布尔值,表示是否设置了 g 标志。
  • ignoreCase:布尔值,表示是否设置了 i 标志。
  • lastIndex:整数,表示开始搜索下一个匹配项的字符位置,从 0 算起。
  • multiline:布尔值,表示是否设置了 m 标志。
  • source:正则表达式的字符串表示,按照字面量形式而非传入构造函数中的字符串模式返回
var pattern1 = /\[bc\]at/i; 
alert(pattern1.global);         //false 
alert(pattern1.ignoreCase);     //true 
alert(pattern1.multiline);      //false 
alert(pattern1.lastIndex);      //0 
alert(pattern1.source);         //"\[bc\]at" 

三、RegExp实例方法

  1. exec()方法
  • 功能:用于检索字符串中的正则表达式的匹配。
  • 参数:string,必须,要检索的字符串。
  • 返回值:返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为 null
var text = "mom and dad and baby"; 
var pattern = /mom( and dad( and baby)?)?/gi; 
var matches = pattern.exec(text); 

// index 表示匹配 项在字符串中的位置
alert(matches.index);     // 0 
// input 表示应用正则表达式的字符串
alert(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"
  1. test()方法
  • 功能:用于检测一个字符串是否匹配某个模式,test()方法经常被用在 if 语句中
  • 参数:string,必须,要检索的字符串。
  • 返回值:true或者false
var text = "000-00-0000"; 
var pattern = /\d{3}-\d{2}-\d{4}/; 
if (pattern.test(text)){ 
    alert("The pattern was matched."); 
} 

注意:支持正则表达式的String对象的方法有:search()match()replace()split()

四、正则表达式中使用的各种字符和元字符

  1. 直接量字符

正则表达式中的所有字母和数字都是按照字面含义进行匹配的,非字母的字符需要通过反斜杠(\)作为前缀进行转义。

正则表达式中的直接量字符:

字符 匹配
数字和字母 自身
\0 NULL (\u0000) 字符
\t 水平制表符 (\u0009)
\n 换行符(\u000A)
\v 垂直制表符(\u000B)
\f 换页符(\u000C)
\r 回车符(\u000D)
\xnn 由十六进制指定的拉丁字符,例如:\x0A等价于\n
\xxxxx 由十六进制指定的Unicode字符,例如:\u0009等价于\t
\cX 控制字符^X,例如:\cJ等价于换行符\n
  1. 字符类

将直接量字符单独放进方括号内就组成了字符类,一个字符类可以匹配它所包含的任意字符。

正则表达式字符类:

字符 匹配
[...] 方括号内的任意字符
[^...] 不在方括号内的任意字符
. 除换行符和其他Unicode行终止符之外的任意字符
\w 任何ASCII字符组成的单词,等价于[a-zA-Z0-9]
\W 任何不是ASCII字符组成的单词,等价于[^a-zA-Z0-9]
\s 任何Unicode空白符
\S 任何非Unicode空白符的字符,注意\W\S不同
\d 任何ASCII数字,等价于[0-9]
\D 除了ASCII数字之外的任何字符,等价于[^0-9]
\b 退格直接量(特例)
  1. 重复

在正则模式之后跟随用以指定字符重复的标记,由于某些重复种类非常常用,因此有一些专门用于表示这种情况的特殊字符。

正则表达式的重复字符语法:

字符 含义
{n,m} 匹配前一项至少n次,但不能超过m
{n,} 匹配前一项n次或者更多次
{n} 匹配前一项n
? 匹配前一项0次或者1次,也就是说前一项是可选的,等价于{0,1}
+ 匹配前一项1次或者多次,等价于{1,}
* 匹配前一项0次或者多次,等价于{0,}
/\d{2,4}/         //匹配2~4个数字
/\w{3}\d?/        //精确匹配三个单词和一个可选的数字
/\s+java\s+/    //匹配前后带有一个或多个空格的字符串"java"
/[^(]*/        //匹配一个或多个非左括号的字符
  1. 选择、分组和引用

正则表达式的选择、分组和引用字符:

字符 含义
| 选择,匹配的是该符号左边的子表达式或右边的子表达式;如果左边的选择项匹配,就忽略右边的匹配项
(...) 组合,将几个项组合为一个单元,这个单元可以通过"*""+""?""|"等等符号加以修饰,而且可以记住和这个组合相匹配的字符串以供此后的引用使用
(?:...) 只组合,把项组合到一个单元,但不记忆与该组相匹配的字符
\n 和第n个分组第一次匹配的字符串相匹配,组是圆括号中的子表达式(也有可能是嵌套的),组索引是从左到右的左括号数,"(?:"形式的分组不编码
  1. 指定匹配位置

正则表达式中的锚字符:

字符 含义
^ 匹配字符串的开头,在多行检索中,匹配一行的开头
$ 匹配字符串的结尾,在多行检索中,匹配一行的结尾
\b 匹配一个单词的边界,简而言之,就是位于字符\w\W之间的位置,或位于字符\w和字符串的开头或者结尾之间的位置
\B 匹配非单词边界的位置
(?=p) 零宽正向先行断言,要求接下来的字符都与p匹配,但不能包括匹配p的那些字符
(?!p) 零宽负向先行断言,要求接下来的字符不与p匹配

相关文章

网友评论

    本文标题:【JS基础】JavaScript引用类型之RegExp 类型

    本文链接:https://www.haomeiwen.com/subject/lfmilqtx.html