JavaScript正则表达式
1.什么是正则表达式
- 按照语法规则去匹配符合条件的的字符串
2.RegExp对象
实例化RegExp对象:
- 1).字面量 例:var reg = /\bis\b/g;
- 2).构造函数 例:var reg = new RegExp('\\bis\\b','g'); \\为转义表示
3.标识符
- i:忽略大小写
- g:全局搜索
- m:多行搜索
4.元字符
- 字符分为两类:原本含义字符和元字符
- 在正则表达式中 ^$(){}[].都不代表原义
5.字符类
- 1).一般情况下正则表达式中一个字符对应字符串中的一个字符
[]可用于创建一个类,所谓类是一个泛指,不是特指某个字符,可以连写 例[a-zA-Z]
- 2).字符类取反:不属于字符类的内容 例[^abc] 不属于a或b或c的字符内容
- 3).范围类:[a-z] 属于a-z这一字符范围内的
***特殊例:var t = 2016-09-10 用 t.replace( /[0-9]/g,'x')结果为xxxx-xx-xx
若使用t.replace(/[0-9-]/g,'x')结果为xxxxxxxxxx
- 4).预定义类:
.除了回车换行之外所有字符
\d数字字符
\D非数字字符
\s空白字符
\S非空白字符
\w单词字符
\W非单词字符
- 5).边界字符
^以xxx开始
$以xxx结束
\b单词边界
\B非单词边界
6.量词
- ?:最多一次
- +:至少一次
- *:任意次
- {n}:出现n次
- {n,m}:出现n到m次
- {n,}至少出现n次
7.贪婪与非贪婪模式
- 贪婪模式:尽量多的匹配
例: '12345678'.replace(/\d{3,6}/g,'x')
x78
- 非贪婪模式:尽量少的匹配,在量词后加上?即可进入非贪婪模式
例: '12345678'.replace(/\d{3,6}?/g,'x')
xx78
8.分组
- 分组:使用 () 可以达到分组的功能,使量词作用于分组
- 或:使用 | 可以达到或的效果
- 反向引用:使用$1$2$3来捕获分组内的内容
例:
'2015-12-01'.replace(/(\d{4})-(\d{2})-(\d{2})/,'$2/$3/$1')
"12/01/2015"
- 忽略分组:不希望捕获某些分组,在分组内加上?:就可以
例:
'2015-12-01'.replace(/(?:\d{4})-(\d{2})-(\d{2})/,'$2/$3/$1')
"01/$3/12"
9.前瞻
- 正则表达式从文本头部向尾部开始解析,文本尾部方向,称为前
- 前瞻就是在正则表达式匹配到规则的时候,向前检查是否符合断言,后顾/后瞻方向相反
- javascript不支持后顾
- 符合和不符合断言称为肯定/正向匹配和否定/负向匹配
- 前瞻reg(?=assert)
'x2d.0s0d2iou'.replace(/\w(?=\d)/g,'Q')
"Q2d.0Q0Q2iou"
- 后瞻reg(!?assert)
'a2*34vv'.replace(/\w(?!\d)/g,'x')
"ax*3xxx"
10.对象属性
- global 是否全文搜索 默认false
- ignore case 是否大小写敏感 默认false
- multiline 多行搜索 默认false
- lastindex 是当前表达式匹配内容的最后一个字符的下一个位置
- source 正则表达式的文本字符串
11.test和exec方法
- test 用于测试字符串参数中是否存在匹配正则表达式模式的字符串 匹配返回true 不匹配返回false
- exec 使用正则表达式模式对字符串执行搜索,并将更新全局RegExp对象的属性以反映匹配结果 若没有匹配结果则返回null 有匹配结果返回数组(数组中有index(声明匹配文本的第一个字符的位置),input(存放被检索的字符串string))
推荐一个正则表达式可视化网站 http://regexper.com