正则表达式是对字符串操作的一种逻辑公式。
它可以做到:
- 给定的字符串是否符合正则表达式的过滤逻辑(匹配)
- 可以通过正则表达式,从字符串中获取我们想要的特定部分(提取)
- 强大的字符串替换能力(替换)
创建正则的方法#2
在 JavaScript 中,正则表达式也是对象,是一种索引类型。
- 使用正则表达式字面量【常用】
var reg = /abc/; - 调用 RegExp 对象的构造函数
var reg = new RegExp('abc');
常用方法#3~5
字符串的方法:
-
split()
根据匹配字符串精确切割父字符串
例如,str.split('a');将得到以单个字母a分割的数组。正则实现以连续的相同字符串分割:
str.split(/a+/);+ 表示一个或多个连续 -
search()
寻找子字符串在父字符串中位置,返回第一次出现的位置下标。正则实现模糊匹配:
str.search(/o\s+o);寻找以 o 开始和结束,并且中间是空白的字符串 -
match()
在父字符串中寻找匹配字符串,返回寻找结果。正则实现返回所有:
str.match(/b+/g);全局修饰符 g 表示会在找到所有匹配字符串后结束 -
replace(a,b)
参数:- a:规定子字符串或要替换目标的正则表达式
- b:一个字符串值,作为替换文本;或一个生成替换文本的函数
函数写法:function (match,){}其中参数match为固定要求
使用例子另见【#13】
正则表达式的方法:
- exec()
在实参中查找字符串,返回位置下标,只能找到第一个匹配的结果
/abc/.exec('abcdefabc'); - test()
判断实参中是否包含子字符串,返回布尔值
e.g./\s/.test('a bc');判断字符串是否包含空格
正则表达式的组成#6
正则表达式中有普通字符和特殊字符(也称元字符 metacharacters)。
特殊字符需要使用转移符号 \ 反斜杠。
在 JavaScript 中,特殊字符主要有:( ) [ ] { } \ ^ $ | ? * +
还有其他的预定义特殊字符:
\t 制表符
\n 回车符
\f 换页符
\b 空格
在 js 的字符串中包含换行,需要使用小引号 ` 包裹。
正则表达式的术语
字符集#7
[] 整体代表一个字符,里面包含多个字符,任意符合其中一个都算满足
- 简单类: 正则的多个字符对应一个字符,我们可以用 [] 把它们括起来,让 [] 这个整体对应一个字符。
[abc]
e.g.o[usb]t——obt、ost、out - 范围类: 有时匹配的东西过多,而且类型又相同,全部输入太麻烦,我们可以在中间加了个横线。
[a-z]、[0-9]、[A-Z]
e.g.id[0-9]——id0、id5 - 负向类: [] 前面加个元字符进行取反,表示匹配不能为括号里面的字符。
[^a]
e.g.o[^0-9]t——oat、o?t、o t - 组合类: 允许用中括号匹配不同类型的单个字符。
[0-9a-b]、[^0-9A-Z]
e.g.o[0-9a-b]t——oat、o?t
修饰符#8
-
g
修饰符用于执行全局匹配(查找所有匹配而非在找到第一个匹配后停止) -
i
修饰符用于执行对大小写不敏感的匹配。
边界#9
-
^
开头,表示后面的正则表达式的匹配结果必须出现在字符串开始 -
$
结尾,表示后面的正则表达式的匹配结果必须出现在字符串结尾
应用中,经常将 ^ 和 $ 同时应用,限制开头和结尾
预定义类#10
以下是等价的
.非回车非换行的任意字符[^\n\r]\d数字字符[0-9]\D非数字字符^[0-9]\s空白字符[\t\n\x0B\f\r]\S非空白字符[^\t\n\x0B\f\r]\w单词字符(所有的字母、数字、下划线)[a-zA-Z_0-9]\W非单词字符[a-zA-Z0-9]
量词#11
跟在正则表达式后
{n}硬性量词,对应零次或者n次{n,m}软性量词,至少出现n次但不超过m次(中间不能有空格){n,}软性量词,至少出现n次(+的升级版)?软性量词,出现零次或一次,等价于{0,1}*软性量词,出现零次或多次(任意次),等价于{0,}+软性量词,出现一次或多次(至少一次),等价于{1,}
分组#12
[] 划定了范围,{} 表示了次数,() 用来分组
或操作符
| 或操作符的优先级极低,需要注意使用分组
e.g.
/^ab|cd$/ 表示以 ab 开头或以 cd 结尾的
/^(ab|cd)$/ 表示以 ab 或 cd 开头并结尾的
分组的反向引用#13
反向引用标识是对正则表达式中的匹配组捕获的子字符串进行编号,从1开始计数。
在表达式内反向引用:\n ;在表达式外反向引用:$n
e.g.
/(bye)\1/.test('byebye'); 结果为 true。寻找
/^([a-z]{3})\1$/.test('byebye'); 结果为。
【不清不楚的】
e.g.
'123*456'.replace(/(\d{3})\*(\d{3})/, function (match),$1,$2){
return $2 + '*' +$1;
})
输出结果:456*123(调换顺序)
中文字符#14
[\u4e00-\u9fa5]