正则表达式是对字符串的一种操作,运用到JS中可以帮助我们去寻找符合要求的字符串(表单验证)。
http://regexper.com
(这个网站可以把正则表达式输入进去然后用图形显示出来,因为是国外的网站,国内登入可能比较慢,甚至进不去,但是可以把把这个东西从git下载到本地,然后在本地http://localhost:8080端口打开,具体操作可以参考其他博客)
其实我觉得正则表达式的学习过程并不是很难,但是因为需要记住的东西有点多,所以需要用实例代码去加深自己的记忆,我可能只是简单的写一些例子,这是远远不够的,因为这个只是自己在刚刚学完的一点小小的总结,如果有人看到的话,希望自己可以多写写!
首先,在我写学习记录的时候,刚刚好一天碰到几次关于'/'与'\'写错了的事情,其实在正则表达式之中这个问题好像更加明显了,去看别人的博客,对它的解释也是蛮多的,觉得有用的一句话是“ "/" 分隔符,"\" 转义字符 ”,而且显示生活中"/"用得比较多,具体更多用法的可以看(路径中 斜杠/和反斜杠\ 的区别)总结得还是比较全面的。(我经常写错,如果下面有些感觉这两个符号我写串了,没错,一定是我写错了,不过这里我已经反复确认过红色字体没有错误了!)
正则表达式的写法是/…………/,中间是具体去匹配的内容
/…………/,最后面可以写(g,i,m)具体的意思是:(这里暂时就没有需要用到'/'的地方了,如果需要匹配的就是/就另外再说了)
(这里的测试可以直接打开f12,在控制台里面输入,然后回车,我这里的这个小例子,运用到了JS中的replace函数,这里是在JS中的一个用法,后面会总结在JS中的其他用法,也可以在https://jsbin.com/中打入输出)
这个小栗子里面的内容现在看可能有点不懂,这是因为某些内容在正则中已经专门去用来表示某些内容了
为什么叫做预定义,就是像写C/C++/JS里面有些字母已经有了特殊的含义,在别的地方用的时候代表的就是程序已经写好的意思,这里的也是类似
我只是列出了部分内容,还有很多,但是用得比较多的基本就是这些
如果在写代码的时候就是需要匹配‘\d’,而不是数字,如果直接写程序就会认定是数字,这个时候就得用到'\',在这里的意思是转义(只有‘\’符号需要转义,字母不需要转义),具体写几个代码表示一下
如果直接写,是会报错的(语法错误)
首先在/……/,最外面有一个g,表示全局匹配,即满足要求的都替换,如果没有g,则满足要求的第一个进行替换,在里面的内容是'\/','\'是转义的意思,就是告诉程序,接下来我写的东西因为被你们占据了,所以需要转义一下,让你们知道我想表示的是我自己本身。
最后面的那个就是我要匹配的是两个'//',如果只写一个的话,它不会自动匹配两个,所以写转义符,只表示我转义的是后面的一个符号,不是多个!
这个就顺便回答了如何匹配转义符号,就是\\,表示转义的字符是 \
那个小圆点我实在没找出来就打的汉字,这些匹配的时候需要转义
这里大概总结了下元字符在程序中的具体应用,可以自己尝试着写一些代码去了解具体匹配的情况,或者在http://regexper.com中去看看具体是怎么表示的。
在量词的匹配的时候,有一个{n,m},表示匹配的次数在n-m次之间,但是如果有多个匹配的到底是匹配n次还是m次呢?
这个就得引入到这个贪婪模式(类似于贪吃蛇一样,想多吃一点),那么程序就想多匹配一点,有k(k>=n)个就匹配k次,最多是匹配m次,
到这里可以看到我写的代码都是简单的替换成字母或者简单的东西,如果需要把匹配到的东西拿出来需要怎么操作呢?
就是用括号括起来看成一个整体去表示这部分匹配的东西是我需要的,需要特殊看待,这个就可以写到程序中(爬虫),去获取我需要的内容,并且按照一定的格式显示出来
有时候在匹配的时候有很多内容有着相似的特点,就是都能够匹配出来,但是呢有时候还有特别的要求,就像一个班级里面有几个人叫小明,匹配到了小明,但是要求匹配到的小明有一个妹妹叫小红,或者没有一个叫小红的妹妹,或者其他条件,这个时候就需要用到前瞻(后顾),因为后顾JS不支持,所以我也没有总结,就只具体说一下前瞻:
也许有人就会说不需要这么麻烦我直接一起写出来去匹配不就好啦,但是一般我们是对匹配出来的内容有其他操作,就像你要叫小明去打扫卫生,是有妹妹的小明,如果不去前瞻的话,那么表示你想要小明小红一起去打扫卫生,而不是小明一个人,这里这么使用只是缩小筛选的范围。
注意到我们去检验写的代码是否准确是用的JS里面的replace函数去替换,有没有直接可以去检测返回true or false的一个专门的函数嘞?既然我这么说了,肯定是有的,那就是test,这个是用于测试字符串参数中是否存在匹配的正则表达式模式的字符串,返回值是true false,但是在使用中的时候会有一些需要注意的地方
举个栗子吧:
/w表示单词字符,(字母、数字、下划线)可以翻阅上面的内容有具体的介绍
表面看上去加了g和没有加g(是否全局匹配)没有什么区别,但是这是不可能的!在秘密之中,全局匹配改变了一个叫做lastIndex的东西,
什么是lastIndex,自己可以百度看官方解释,我自己的理解就是:因为全局匹配不想非全局匹配,非全局匹配匹配完之后就不会继续匹配下去了,而全局匹配不同,还要继续去检索有没有符合要求的,那个如果每次都重新开始是不现实的,那么就得有一个变量去记录这个下次开始的地方在哪里,lastIndex就是这个功能,就是记录下一次我匹配的下标,在非全局匹配的情况下,lastIndex恒等于0;
举个栗子:
我打印三次reg2的内容,发现前面两次是一样的返回true,为什么第三次是false呢?就是这个lastIndex有区别,我们可以试着打印出来
这样一来我们就看出来了区别,这个lastIndex不断在更新,在第一次匹配到a符合要求之后返回true,然后下一次应该从b开始匹配,则lastIndex就是b的下标1,以此类推,变成一个圆不断在变化。
还有另外一个叫做exec
这个和test类似,只是把匹配到的内容提取出来,就像我需要匹配字母,具体不知道是那个字母,这个时候我们就可以运用这个去打印出来具体是哪一个字母。
举个栗子:
如果我var ans2 = reg2.exec(ts),则在定义的时候已经调用了一次exec函数。返回的exec数组里面包含的内容:如果不匹配就是NULL,如果匹配首先是匹配到的内容,然后就是每一个分组的内容。
最后面说一下正则表达式在JS里面的应用,主要有四个
正则表达式的基本内容大致梳理在此,如果后面碰到了其他情况会给予添加
18-11-11:汉字的匹配区间\u4e00——\u9fa5
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)