from 比较全面的正则表达式使用教程
本文内容有一部分是JS里面的,有一部分是Python中的,所以,可能会出现不兼容的情况,请见谅。
修饰符(JS)
g:全局查找,否则,匹配一次就结束 i:不区分大小写 m:多行搜索,默认正则把换行当成字符处理,使用m后,换行被看做是新字符串的开始,一般搭配'^'使用
用法:new RegExp( '\\bis\\b', 'g' );
元字符
|:或,例:a|b,表示匹配a或者b \:转义字符 ():分组,例:(aaa){5},匹配'aaa'5次,用 ?: 取消分组,如 (?:\d)(a) 则,第一分组是匹配到的a {}:量词,\d{20}表示匹配20个数字 \t:水平制表符(Tab) \v:垂直制表符 \n:换行符 \r:回车符 \0:空字符 \f:换页符 \cX:相当于Ctrl + X
类
使用[]来创建类
如 [abc],则遇到a、b、c都会匹配,但是只会匹配其中的一个(bac,用 [abc] 匹配,只会得到b)
反向类:
- [^abc],匹配不是其中的即可
范围类:
- [a-zA-Z],则匹配所有字母
- [0-9],则匹配所有数字
- [0-9-],则匹配所有数字以及 '-' 字符
预定义类:
- .:除回车换行以外的所有字符
- \d:数字
- \D:非数字
- \s:空白符
- \S:非空白符
- \w:单词字符(字母数字下划线
- \W:非单词字符
边界
- \b:单词边界
- \B:非单词边界,This \Bis\b
- ^:开头
- $:结尾
量词
- ?:最多一次
- +:最少一次
- *:任意次
- {n}:n次
- {n,m}:n到m次
- {n,}:至少n次
- {0,m}:最多m次
- 正则默认为贪婪模式,匹配最多次,通过'?'取消贪婪模式:\d{3,5}?
反向引用(JS)
$n表示第n个分组的内容,如果不分组,则把$n当成字符串
断言
前瞻后顾,正则从字符串开始位置向后匹配,所以字符串末尾方向为前(JS不支持后顾)
前瞻:当匹配到某字符时,看前面的字符是否符合断言
- 正向前瞻:(?=\d),当匹配到了之后看之后字符是否是数字,只有是数字匹配才成功
- 负向前瞻:(?!\d),只有不是数字匹配才成功
以下为JS内正则的使用方法
定义正则表达式
var reg = /\bis\b/g;
or
var reg = new RegExp( '\\bis\\b', 'g' );
对象属性
lastIndex:当前匹配内容的下一字符的位置(如果不是全局查找,则lastIndex不生效,始终为0)
PS: 以下的reg表示合法的正则表达式,str表示字符串
正则自带的方法函数
reg.test(str) 是否能匹配到,可以则返回true,不可以返回false
ret = reg.exec(str) 未匹配上则返回 null 匹配上则返回:匹配到的文本,分组的文本(如果有的话,有几个返回几个) ret.index:匹配字符的起始位置
JS字符串有关正则的方法函数
str.search(reg) 不支持全局匹配 匹配不到返回-1 匹配到返回匹配字符的起始位置
str.match(reg) 未匹配上则返回null
- 非全局调用:
- ret = str1.match(str2)
- ret.index:匹配字符的起始位置
- 返回的数组:匹配到的文本,分组的文本(如果有的话,有几个返回几个)
- 全局调用:
- 没有index属性
- 返回的数组:匹配到的文本,分组的文本(如果有的话,有几个返回几个)
str.split(reg) 可传入正则
str.replace(reg1,reg2) 支持分组,在reg2中通过$n获取匹配到的内容实现动态替换 默认全局匹配为false
- reg2可为function
- 参数:匹配到的字符串,分组内容(有几个就是几个参数),匹配字符的起始位置,原字符串
- 一般不用分组内容,通用型太差
- 例如,以下代码的结果为 a2b3c4:
'a1b2c3'.replace( /\d/g, function( match, index, original ){
return parseInt( match ) + 1;
})