JS 中的正则表达式
更新日期:
相关概念
用途
模式匹配:有效性验证、提取子串、查找特定字符、替换
语法
定界符//
格式:/匹配模式/
定位符
- ^ 开头
- $ 结束
- b 单词边界
- B 非单词边界
元字符
元字符:具有特殊意义的字符
字符类
- s 空白字符,比如空格、tab键、换行
- S 非空白字符
- w 字母、数字、下划线
- W 非w
- d 数字
- D 非数字
- . 除换行外的所有字符
说明:
d 不匹配圆角的0-9的字符
w 不匹配汉字、不匹配圆角的数字、字母、下划线
s 开头的中间的结尾的空白字符 都会匹配
s和S w和W d和D 等可认为是互逆运算
量词限定符
量词,限定符:规定给定的组件必须要出现多少次才能满足匹配
- +至少1次 (前导字符在目标对象中连续出现)
- *0次 或 多次
- ?0次 或 1次
- {n} 非负整数 匹配确定的n次
- {n,} 至少匹配n次
- {n,m} 匹配n到m次
运算符
- [] 指定一个范围。eg. [a-zA-Z0-9]
- () 组合字符串,所包含的内容必须同时一起。
eg. ([a-z][A-Z][0-9]),aA0匹配,aAA不匹配 - | 管道符,或的意思,多个不同的模式。
eg. (fo|foo|fool),匹配fo, 也匹配foo,也匹配 fool - ^ 否定运算符。
一般出现在[]内部的是否定运算符,[]之外的是定位符^。eg. [^0-9] 表示除0-9数字之外的所有字符
转义字符
JS 中的正则
定义
ECMAScript 通过 RegExp 类型支持正则表达式
用字面量形式
用字面量形式定义正则表达式,格式是:
|
|
3个 flags 标识
g 全局模式(global)
i 不区分大小写模式(case-insensitive)
m 多行模式(multiline)
比如:
/at/g 匹配字符串中所有”at”的实例
/[bc]at/i 匹配第一个”bat”或”cat”,不区分大小写
/.at/gi 匹配所有以”at”结尾的3个字符的组合,不区分大小写
patttern 模式中的元字符
元字符共有14个 ^$. []{}?+* ()| \
在模式中使用元字符时,都必须进行转义
比如:
/[bc]at/i 匹配第一个”[bc]at”,不区分大小写
/.at/gi 匹配所有以”.at”结尾的字符组合,不区分大小写
用 RegExp 构造函数
|
|
注意,此处参数 pattern 和 flag 都是 string 类型,而不带正则表达式的定界符 //
对比
相同点:以下的两个正则表达式是完全等价的
var pattern1 = /[bc]at/i;
var pattern2 = new RegExp(“[bc]at”, “i”);
不同点:RegExp 的构造函数的参数都是字符串,所以在某些情况下就需要对字符进行双重转义,比如字符 \ 在字符串中通常被转义成 \
RegExp 的实例属性
正则表达式的每一个实例都具有以下属性(可以取得有关模式的基本信息)
- global
- ignoreCase
- multiline
- source 正则表达式的字符串表示,按照字面量形式传入的(而不管它是以字面量形式创建还是 RegExp 构造函数创建的)
- lastIndex 整数,表示开始搜索下一个匹配项的字符位置,从0开始
通过这些属性可以获得一个正则表达式的各方面的信息,不过没多大用处。因为这些信息大部分都包含在模式声明中。
lastIndex 属性在配合方法 exec() 时还是有用处的。
RegExp 的实例方法
exec()
exec() 专门为捕获组而设计
参数:要应用模式的字符串
返回:包含第一个匹配项信息的数组 或者 null
数组的第一项是:与整个模式匹配的字符串
数组的第二项(及其他项都是)是:与模式中的捕获组匹配的字符串(如果模式中没有捕获组,那数据就只含有1项!)
数组的实例,有两个额外的属性:
index 表示匹配项在字符串中的位置
input 表示应用正则表达式的字符串
对 exec()而言,即使在模式中设置了全局标志 g,它每次也只会返回一个匹配性
它的作用在于:每次调用 exec() 都会在字符串中继续查找新的匹配项。
而不设置 g 时,在同一个字符串上多次调用 exec() 将始终返回第一个匹配项的信息。
此外,注意 lastIndex 属性的变化!
test()
test() 只判断是否匹配,
参数:字符串
返回:当模式与字符串匹配时,返回true;否则返回false
如果只想知道目标字符串与某个模式是否匹配,但不需要知道其文本内容的情况下,这个方法很方便。test() 方法经常用于 if() 语句中。
场景:验证用户输入的情况下
其他方法:
.toString() 和 .toLocaleString() 这两方法都会返回正则表达式的字面量,与创建的方式无关。字符串形式的字面量。
.valueOf() 返回正则表达式本身
RegExp 构造函数的属性
这些属性,可以理解为是:静态的。即是全局的。
它们适用于作用域中的所有正则表达式,并且是基于最近一次执行的正则表达式操作而变化。
利用这些属性,可以从 exec() 和 test() 执行的操纵中提取更具体的信息。比如:最近一次要匹配的字符串;最近一次的匹配项;最近一次匹配的捕获组;匹配项目左边、右边的内容(自我感觉用处不大,故未列出。详情参考P108)
除了这些外,还有多达9个用于存储捕获组的构造函数属性。可以像如下访问:
RegExp.$1
RegExp.$2
…
RegExp.$9
分别存储第1到9个匹配的捕获组。
在调用 exec() 和 test() 方法时,这些属性会被自动填充。然后我们就可以直接使用啦。
其他
String对象支持正则的方法
- search() 检索
- match() 查找
- replace() 替换
- split() 分割
参考
《JavaScript高级程序设计(第3版)》 中的第5章 引用类型: 5.4 RegExp 类型
Q1: 字符串中的字符为什么要进行转义?都有哪些字符?eg. \ 会被转义成 \