对于正则表达式一直很懵,写个总结理清一下思路。-_-
- 正则表达式语法
- 字面量
- 构造函数
var reg = /\d/g;
var reg = new RegExp('\\d','g');
tips: 构造函数方法中,\d中的反斜杠要转义
eg:
var reg = /\d/g;
var reg = new RegExp('\\d','g');
'3e'.replace(reg,'t');
=> 'te'
修饰符
- g : 全局匹配
- i : 只匹配小写
- m : 多行搜索
tips: 这里注意下m的使用例子
var mulSrt="@123\n@456\n@890"; mulSrt.replace(/^@\d/gm,'Q'); => "Q23 Q56 Q890"
元字符
- 原义文本字符
- 元字符 (正则表达式中有特殊含义的非字母字符)
eg:* + ? $ ^ . | \ ( ) { } [ ]
Tips: 正则表达式中的一个字符,对应字符串一个字符
eg: ab\t
对应 a b tab
字符类,用 [ ] 构建一个类
- 泛指符合某些特性的对象,不是特指字符
- 如[abc],指把a b c 归为一类
- [^abc] 表示不是a或b或c的内容。在范围内的^表示取反
'a1b1c1d1'.replace(/[abc]/g,'x') => 'x1x1x1x1' 'a1b1c1d1'.replace(/[^abc]/g,'x') =>"axbxcxxx"
范围类
- [a-z]
- 表示a到z , 闭区间,包含 a、z本身
- 范围内部可以连写
eg: [a-zA-Z] 匹配小写a-z 和 大写A-Z - 如果要匹配横线,eg: [a-z-]
预定义字符
- . 除回车符和换行符之外的所有字符
- \d 数字字符
- \D 非数字字符
- \w 单词字符(字母、数字、下划线)
- \W 非单词字符
- \s 空白符
- \S 非空白符
eg: ab+数字+任意字符
ab\d.边界
- ^ 开始
- $ 结束
- \b 单词有边界
- \B 单词无边界
量词
- ? 最多出现一次
- +至少出现一次
- *任意次
- {n} 出现n次
- {n,m} n 到 m次
- {n,} 至少出现n次
贪婪模式
Tips: 尽可能多地匹配,比如 {3,5}会匹配5次
'12345678'.replace(/\d{3,6}/,'X'); =>"X78"
非贪婪模式
- 尽可能少的匹配,在量词后加上?
'12345678'.replace(/\d{3,6}?/,'X'); => "X45678"
分组 ( )
- 用()进行分组,达到量词匹配
/abc{3}/ 表示匹配c 3次 /(abc){3}/ 表示匹配abc 3次
- 或 |
'ByronsperByrCasper'.replace(/Byr(on|Ca)sper/g,'X') => "XX"
- 反向引用
'2016-11-25'.replace(/(\d{4})-(\d{2})-(\d{2})/g,'$2-$3-$1'); => "11-25-2016"
前瞻
- 正向 exp(?=assert)
- 正向 exp(?=assert)
eg: \w(?=\d) 匹配单词后面是数字
'a2*34v8'.replace(/\w(?=\d)/g,'x') "x2*x4x8"
最后几道测试题
匹配其中的 is 单词
This is a test.去掉http协议的jpg文件的协议头
http://img.host/78.jpg年/月/日 格式改成 日-月-年
2006/02/03