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

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匹配
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342