前言
具体视频请看慕课网javascript教程
Regexp对象
实例化regexp对象的两种方式:
- 字面量:var reg=/\bis\b/g (\b单词边界)
- 构造函数: var reg= new RegExp(’\bis\b’, ‘g’) (第一个参数字符串,\特殊字符需转义)
修饰符
g:global全局搜索,不添加搜索第一个匹配后停止
i:ignore case 忽略大小写,不写大小写敏感
m:multiline 多行搜索
元字符
- 原义文本字符:如 abc123
- 元字符: 在正则表达式有特殊含义,需转义的字符 . * + ? $ ^ . | \ ( ) { } [ ]
字符 | 含义 |
---|---|
\t | 水平制表符 |
\v | 垂直制表符 |
\h | 换行度 |
\r | 回车符 |
\o | 空字符 |
\f | 换页符 |
\cx | 与x对应的控制字符(ctrl+x) |
字符类
[ ] 用来构建一个类,类是泛指符合某些特性的对象。
如 [abc] 把字符a或者b或者c归为一类,表达式可以匹配这类字符。有他们其中的任意一个就行
'a1b2c3d4'.replace(/[abc]/g, 'X'); // X1X2X3d4
字符类取反
使用 ^ 创建反响类,指不属于某类的内容
如 [^abc] 表示不是a或b或c的内容
'a1b2c3d4'.replace(/[^abc]/g, 'X'); // aXbXcXXX
范围类
使用字符类来匹配数字的正则 [0123456789]
[a-z] 包含a到z任意字符,包含a和z本身
[a-zA-Z] 类的内部是可以连写的,匹配a到z,A到Z的字符
'2016-09-12'.replace(/[0-9]/g, 'A'); // AAAA-AA-AA
如何匹配横线 -
'2016-09-12'.replace(/[0-9-]/g, 'A'); // AAAAAAAAAA
预定义类
匹配常见的字符类:
字符 | 等价类 | 含义 |
---|---|---|
. | [^\r\n] | 除了回车符和换行符之外的任意字符 |
\d | [0-9] | 数字字符 |
\D | [^0-9] | 非数字字符 |
\s | [\t\n\x0B\f\r] | 空白符 |
\S | [^\t\n\x0B\f\r] | 非空白符 |
\w | [0-9a-zA-Z_] | 单词字符(大小写字符、数字、下划线) |
\W | [^0-9a-zA-Z_] | 非单词字符 |
demo: 匹配ab+数字+任意字符的字符串-
/ab[0-9][^\r\n]/
/ab\d./ //书写简便
边界
字符 | 含义 |
---|---|
^ | 以XXX开头 |
$ | 以XXX结尾 |
\b | 单词边界 |
\B | 非单词边界 |
demo:
“@123\r@345\r@789” 想匹配 @+数字
"@123\r@345\r@789".replace(/^@\d/g, 'X'); //"X23@345@789"
"@123\r@345\r@789".replace(/^@\d/gm, 'X'); //"X23X45X89"
量词
字符 | 含义 |
---|---|
? | 出现0次或1次(最多一次) |
+ | 出现1次或多次(至少出现1次) |
* | 出现0次或多次(任意次) |
{n} | 出现n次 |
{n,m} | 出现n到m次 |
{n,} | 至少出现n次 |
demo:要求匹配一个连续出现的数字20的内容 \d{20}
贪婪模式
正则表达式尽可能多的匹配,直到匹配失败
"12345678".replace(/\d{3,6}/g, 'X'); //"X78"
非贪婪模式
如有需求,让正则表达式尽可能少的匹配,也就是说一旦匹配成功,不在继续尝试,这就是非贪婪模式
解决办法: 在量词后面加上?即可
"12345678".replace(/\d{3,6}?/g, 'X'); //"XX78"
"12345678".match(/\d{3,6}?/g); //["123", "456"]
分组
( ) 实现分组
demo: 匹配字符串Byron连续出现3次的场景
/Byron{3}/ 错误 {3}重复3次的内容是n,并不是Byron。
那么如何作用到整个单词?
/(Byron){3}/ 分组的功能,能使量词作用于分组
或
| 可以实现或的作用
比如Byron|Casper
比如Byr(on|Ca)sper
反向引用
"2015-12-25".replace(/-/g, '/'); //"2015/12/25"
"2015-12-25".replace(/(\d{4})-(\d{2})-(\d{2})/g, '$1/$2/$3'); //"2015/12/25"
"2015-12-25".replace(/(\d{4})-(\d{2})-(\d{2})/g, '$3/$2/$1'); //"25/12/2015"
忽略分组
如果不希望捕获某些分组,只需要在分组内加上 ?: 就可以了
"Byron1ok".replace(/(?:Byron).(ok)/g, '$1'); //"ok"
前瞻
正则表达式是从文本从头到尾解析,文本尾部方向,称为前,文本头部方向,称为后.
前瞻就是正则表达式匹配到规则的时候,向前检查是否符合断言。后顾的方向相反。javascript不支持后顾
断言可以是肯定也可以是否定。
名称 | 含义 |
---|---|
正向前瞻 | exp(?=assert) |
负向前瞻 | exp(?!assert) |
"a2*3".replace(/\w(?=\d)/g, 'X'); //"X2*3"
"a2*3".replace(/\w(?!\d)/g, 'X'); //"aX*X"
对象属性
gloabl 默认值false
ignoreCase 默认值false
multiline 默认值false
lastIndex 是当前表达式匹配内容的最后一个字符的下一个位置
source 正则表达式的文本字符串
var reg1 = /\w/;
var reg2 = /\w/gim;
reg1.global //false
reg1.ignoreCase //false
reg1.multiline //false
reg1.resource // "\w"
reg2.global //true
reg2.ignoreCase //true
reg2,multiline //true
reg1.global = true; //不能赋值
reg1.global //false
reg2.test('ab'); //true
reg2.test('ab'); //true
reg2.test('ab'); //false 和lastIndex有关系
while(reg2.test('ab')) {
console.log(reg2.lastIndex); // 1 2 没有以后重置为0
}
// 解决这种问题两种方式
(/\w/g).test("a"); // true 内存开销大一些
var reg2 = /\w/; //没有标志g,lastIndex就无效了,永远是0