RegExp——正则表达式的使用

正则表达式:按照某种规则去匹配符合条件的字符串

正则表达式工具:http://regexper.com

g代表global,会匹配全部符合规则的字符串,如果不加g,返回的是第一个符合的字符串
使用构造函数var reg = new RegExp('\\bis\\b' , 'g') 在js中 \ 属于特殊字符,需要转义 ,第二个参数表示global全局匹配


字面量/对象属性:
写在正则表达式外面,例如 /\bis\b/gi
g:global全文搜索,不添加的话,搜索到第一个匹配停止
i:ignore case 忽略大小写,正则表达式默认大小写敏感的
m:multiple lines 多行搜索
lastIndex:是当前表达式匹配内容的最后一个字符的下一个位置,就是设置下一次搜索的开始位置(在global下生效)
source:正则表达式的文本字符串

test方法:

用于测试字符串参数中是否存在匹配的正则表达式模式的字符串,如果存在就返回true,否则返回false,例:/\w/.test('a'),返回true(使用全局匹配会默认调用lastIndex属性,而不是重头开始,所以会出现结果不稳定的假象,可以通过循环/\w/.test('a'),打印/\w/.lastIndex查看)
exec方法:

使用正则表达式对字符串执行搜索,并将更新全局RegExp对象的属性以反映结果,如果没有匹配的文本则返回null,否则返回一个结果数组( 数组中包含index以及input属性,index声明匹配文本的第一个字符的位置,input属性存放被检索的字符串string,也就是本身的参数是谁,在返回的数组中,第一个元素是与正则表达式匹配的文本,第二个元素是分组中的字符串(如果有),第三个元素是分组中的字符串(如果有),以此类推)

元字符:

在正则表达式中有特殊含义的非字母字符(* + ? $ ^ . | \ () {} [])


字符类:
我们可以使用元字符[]来构建一个简单的类,所谓的类就是指符合某些特征的对象,一个泛指,而不是特指某个字符,例如表达式[abc]可以将a字符或b字符或c字符归为一类,表达式可以匹配这类的字符
字符类取反:使用^创建反向类/负向类 (不属于某类的内容),表达式[^abc]表示不是a或b或c字符的内容
范围类:\[a-z]\g来连接两个字符表示从a到z的任意字符,这是个闭区间,包含a以及z本身,如果需要匹配多个,直接添加到[]中即可,如\[a-zA-Z]\g就可以匹配大小写字母了,需要匹配特殊字符,如-,添加到范围外,区间内即可,如\[a-z-]\g

预定义类:

. 等价于[^\r\n] 除了回车和换行符之外的所有字符
\d 等价于[0-9] 数字字符
\D 等价于[^0-9] 非数字字符
\s 等价于[\t\n\x0B\f\r] 空白符
\S 等价于[^\t\n\x0B\f\r] 非空白符
\w 等价于[a-zA-Z_0-9] 单词字符(字母、数字、下划线)
\W 等价于[^a-zA-Z_0-9] 非单词字符

边界匹配符:
\b 代表单词边界,在两个\b中间添加字符,代表一个完整的单词
\B 非单词边界 例('This is a boy'.replace(/\Bis\b/g , '0'),就可以把This中的is改为0,而又不会影响单词is)
^ 在中括号中表示取反,还可以表示以XXX开始
$ 表示以XXX结束

量词:
? 出现零次或一次(最多出现一次)
+ 出现一次或多次 (至少出现一次)
* 出现零次或多次(任意次)
{n} 出现n次
{n,m} 出现n到m次
{n,} 至少n次

贪婪模式:

正则表达式会尽可能多的匹配,如:'1234567'.replace(/\d{3,5}/g , 'A'),返回的会是A67


非贪婪模式(?):

尽可能少的破匹配,也就是说一旦成功匹配就不再继续尝试,只需在量词后面加一个问号就可以了,如:'1234567'.replace(/\d{3,5}?/g , 'A'),返回的会是AA7

分组:使用()可以达到分组的功能,使量词作用于分组,如/(Byron){3}/,如果不使用分组,Byron{3}只会匹配n3次
或:使用|可以达到或的效果
 
反向引用:使用$1可以捕获第一个分组的数据,以此类推,如:'2018-09-16'.replace(/(\d{4})-(\d{2})-(\d{2})/g, '$1' )就可以获取 2018


忽略分组:想利用分组,但是又不想捕获它,只需在分组内加上?:就可以了,如:(?:Byron).(ok),输出的$1为ok

前瞻:正则表达式从文本的头部向尾部解析,文本尾部为前,前瞻就是在正则表达式匹配到规则的时候,向前检查是否符合断言 (Javascript不支持后顾,后顾方向相反)
正向前瞻:exp(?=assert),检查前面部分是否符合断言部分(断言部分只参与检查,不参与计算,例:'a2*3'.replace(/\w(?=\d)/g,'X')  返回的是X2*3)
负向前瞻:exp(?!assert),检查前面部分是否不符合断言部分

string中的方法(其实传入的实参都会转换成正则,然后再进行查找等操作):
search方法会忽略全局查找,返回第一个匹配到的结果,也就是全局不会生效,每次查找都会从头开始
match方法检索字符串,查找一个或多个与RegExp匹配的文本,与正则的exec方法相比,match,返回的数组不会包含分组元素,也没有index属性以及lastIndex属性,如果只需要返回匹配的数组,使用match效率会比正则的exec方法高
split方法分割字符串,例:'a1b2c3d'.split(/\d/g),输出["a", "b", "c", "d"]
replace方法查找第一个参数(字符串或者正则),改为第二个参数(字符串或者function的返回值,function会在每次匹配替换时调用,第一个参数为匹配字符串,第二个为正则表达式分组内容(如果有),第三个位匹配项在字符串中的index,第四个为原字符串)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值