假如不经常写正则表达式的话,真是学一遍忘一遍。自己再复习一遍正则表达式。另外,归纳篇会持续更新文章,但更新的目录可能是跳跃式,因为主要是我自己查缺补漏,参考梳理,后面还会再开一篇常用正则表达式汇总,自己写一遍加深这些规则,以后项目中要是用到可以比较方便。
正则表达式的定义
- 正则表达式是一个描述字符模式的对象。
- ECMAScript中的RegExp类表示正则表达式。
- 正则表达式用来验证客户端的输入数据。
创建正则表达式
- 和创建字符串类似,一种是new方式,一种是字面量方式
var pattern =new RegExp('pattern',‘gi’); //new方式,第一个参数是模式字符串,第二个可选参数是模式修饰符
var pattern2=/pattern2/ig; //字面量方式,模式修饰符i(忽略大小写),g(全局匹配),m(多行匹配)
正则表达式的属性和方法
- 静态属性和实例属性(都没啥大用,了解过下)
- 静态属性 :input、leftContext、rightContect、lastMatch、lastPattern、multiline
var pattern =/google/;
var str='This is a google!';
pattern.test(str);//必须执行一下,静态属性才有效
alert(RegExp.input) //当前被匹配的字符串
alert(RegExp.leftContext) //当前被匹配的字符串的前子串
alert(RegExp.rightContext) //当前被匹配的字符串的后子串
alert(RegExp.lastMatch) //google 最后一个被匹配的字符串
alert(RegExp.lastPattern)// 最后一对圆括号里匹配的字符串
alert(RegExp.multiline)// false 用于指定是否所有的表达式都用于多行的布尔值
- 实例属性:global、ignoreCase、lastIndex、multiline、source
- 2个测试方法test()和exec();1个编译方法compile()
-
test()
在字符串中测试模式匹配,返回true和false; -
exec()
在字符串中执行匹配搜索,返回结果数组,其中存放匹配的结果;如果没有匹配就返回null;
-
-
compile()
编译和改变后重新编译正则表达式;
- 使用字符串的正则表达式的4个方法:
-
match()
:返回pattern中 子串或null;获取匹配的数组 -
replace(pattern,replacement)
:返回替换后的字符串; -
search()
:返回匹配字符串中开始位置,找不到则返回-1 -
split()
:返回字符串指定匹配字符串拆分的数组
var pattern =/google/g;
var str='this google googlea googlea';
console.log(str.match(pattern)); //返回数组["google", "google", "google"]
console.log(str.replace(pattern,'box')); //开启全局,全部替换,返回this box boxa boxa
console.log(str.search(pattern)); //返回位置5
console.log(str.split(pattern)); //返回数组["this ", " ", "a ", "a"]
正则表达式的符号
- 正则表达式由两种基本字符类型组成:原义文本字符和元字符
- 元字符是在正则表达式中含有特殊含义的非字母字符
\t //水平制表符
\v //垂直制表符
\n //换行符
\r //回车符
\0 //空字符
\f //换页符
\cX //与X对应的控制字符(Ctrl+x)
- 字符类:
var pattern=/[abc]/ //泛指字符abc这一类的字符
var pattern=/[^abc]/ //^创建反向类/负向类,不属于某类的内容。表示不是a或b或c的内
- 范围类
'assklja1223'.replace(/[a-z]/g,'7'); // 得到"77777771223"。[a-z]表示26个小写字母a-z,也可以连写[a-zA-Z]
'as-sk-lja-122-3'.replace(/[a-z-]/g,'Q'); //得到"QQQQQQQQQQ122Q3"。要匹配连字符-就直接加在里面[a-z-]
- js预定义类及边界
. //除了回车符和换行符之外的所有字符
\d //数字字符
\D //非数字字符
\s //空白符
\S //非空白符
\w //单词字符(字母数字下划线)
\W //非单词字符
^ //以什么开始,只有在[]里面^表示取反
$ //以什么结束
\b //单词边界
\B //非单词边界
-
量词
- 匹配连续出现多次
?//出现0次或1次
+ //至少出现1次
* //出现任意次
{n} //出现n次
{n,m} //出现n到m
{n,} //至少出现n次
- 匹配连续出现多次
-
js正则贪婪模式和非贪婪模式
- 正则表达式默认会尽可能多的去匹配
'12345678'.replace(/\d{3,6}/g,'S') //得出'S78'
- 让正则表达式尽可能少的匹配,一旦匹配成功不再继续尝试匹配就是非贪婪模式。做法就是在量词后面加上?
'123456789'.match(/\d{3,5}?/g) //得出["123", "456", "789"]
- 正则表达式默认会尽可能多的去匹配
-
分组
- 使用()可以达到使量词作用于分组
'a1b2c3d4'.replace(/([a-z]\d){2}/g,'Ac') //得到"AcAc"
- 或 (使用 | 可以达到或的效果)
'carrfcaggty'.replace(/ca(rr|gg)/g,'BB') //得到'BBfBBty'
- 反向引用
//2015-12-25=>12/25/2015
//只有在分组里,$1$2$3捕获分组
'2015-12-25'.replace(/(\d{4})-(\d{2})-(\d{2})/g,'$2/$3/$1');
//如果不希望某些分组被捕获,只要在分组内加上?:就可以
- 使用()可以达到使量词作用于分组
-
前瞻
- 正则表达式从文本头部像文本尾部开始解析,文本尾部方向,称为“前”。
- 前瞻就是在正则表达式匹配到规则的时候,向前检查是否符合断言;后顾/后瞻方向相反
- JavaScript不支持后顾
- 符合和不符合特定断言称为肯定/正向匹配和否定/负向匹配
'a2*3'.replace(/\w(?=\d)/g,'x') //得出"x2*3"。 //正向前瞻exp(?=assert) //负向前瞻exp(?!=assert) //前面是一个正则,后面是一个断言规则
网友评论