[博客迁移][正则表达式] 比较全面的正则表达式使用教程

215 阅读2分钟

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; 
})