正则之基本入门
以前看了许许多多的正则教程,收货并不多,往往都是蜻蜓点水,一点就过。事实上,正则用处真的超级大,比如匹配innerHTML的内容,以及表单验证,也是非他莫属。这里,我结合js,对正则进行一个简单的介绍吧。 如有纰漏欢迎指出,希望大家多多包涵。 js与正则的关系在js中定义一个正则有两种方法,一个是实例化,一个是字面量。 //字面量 var re = /w+/; //这两者等价 //实例化 var re = new RegExp('w+'); 如果想添加一些flags也是没有问题的。 /i (忽略大小写,ignore) /g (全文查找出现的所有匹配字符,global) /m (多行查找,multiLine) /ig(全文查找、忽略大小写,ignore+global) 所以,使用flag之后可以这样写. var reg = ^d{5,12}i$ ;//表示忽略大小写,匹配; //或者 var reg = new RegExp(^d{5,12}i$); 正式入门正则正则其实就是用来匹配字符串的。他用一个简洁表达了,完成了你需要写很多代码的事,就和md(markdown)语法是一个道理。 用的人多了,自然成标准,这也是规则吧。 正则预定字符预定字符,就是用程序比较难表达的一些字符,比如回车键,tab键(通过空格来区分达到的效果).
恩,大部分就是这几个了。 上面提到 r和n,他们到底有什么却别。 没错,看字面量,感觉return 不就是换行吗? 其实,这样说没错,但是得区分系统,在Unix为扩展的系统,在每行的结尾只有"n",而在window下则是:"rn"(顺序不能换). 所以,为了解决系统的差异,就出现了两种: r || n. var reg = /[rn]/g; 这样就能保证系统的兼容性. 字符类所谓的字符类同样也是将你平常要花很多时间做出来的,集成为一个简洁表达。(相当于写库)。
来我们看几个例子 console.log(/s+/.test(" ")); //true console.log(/d+/.test("1234231")); //true console.log(/D+/.test(" ")); //true 其他的如上。 锚字符这个应该算是正则里面,取名最好理解的一个。使用正则就是停船一样,你需要设置你停的位置,我也需要设置我的边界。
这几个应该算是我平常用的最多的几个吧。 var reg = /^d+$/; //匹配整个字符串为数字 量词字符"望文生义",这类字符使用来限定某某出现的次数的。
这个应该不用多说了。 直接看例子吧 console.log(/^d+$/.test("123")); //true 上面说了这么多内置的字符,那我想使用特定字符类怎么办嘞。其实也很简单。使用""转义字符。 console.log(/{.+}/.test("{123}")); //true 但事实上,量词还分为3种,有贪婪量词,惰性量词,支配性量词。 console.log(/.+/.test("abcd")); //true 惰性量词 console.log(/d+?/.test("1fjkdf")); //true 这里阐述一些惰性和贪婪匹配的区别。 var str = "blablablabla"; console.log(str.match(/(b.*a)/g)); //["blablablabla"] 我们最少重复匹配(惰性匹配) console.log(str.match(/(b.*?a)/g)); //["bla","bla","bla"] 支配性量词 正则: /d*+/; 其实上面只要留个印象就可以,只有当你真正使用的时候,你才会有感触。 中括号的用法我们从小学学过来,老师告诉我们,我们使用括号有3种,一个是( ),一个是[],一个是{}. var reg = /[abc]/; console.log(reg.test("a")); //true 可以看出,reg可以匹配 a|b|c. 平常使用的时候,可以直接向一个字符使用就可以了。 console.log(/[^abc]/.test("c")); //false 范围字符 d => [0-9] w => [0-9a-zA-Z_] S => [^tnx0Bfr] (f标识分页符) ... 另外这个范围字符还有一个好处,就是匹配中文。(电脑都是外国人发明的呀。) console.log(/[u4e00-u9fa5]{1}/.test("艹")); //true 这就是中括号的常用用法。 小括号使用小括号的主要作用其实就是分组。平常是用来提取匹配到的字符串。 console.log(/(jimmy)+/.test("jimmy")); //true 而且,配合使用match方法,可以获得匹配到的内容.(这里不加括号也是可以的). var name = "My name is Jimmy"; console.log(name.match(/(Jimmy)/g)); //["Jimmy"] 需要注意在括号里面写正则和没有括号的时候,是没有区别的。我们可以在()内嵌套你想加的。(如果你想嵌套()的话,Sorry,这样并没有什么卵用). var name = "My name is Jimmy Jimy"; console.log(name.match(/(Jimm?y)/g)); //["Jimmy","Jimy"] 候选(或) var name = "My name is Jimmy sam"; var reg = /(jimmy|sam)+?/ig; console.log(name.match(reg)); //["jimmy","sam"] 反向引用 var reg = /(100)1/; var reg2 = /(100)(99)(101)123/; //1=>100,2=>99,3=>101 在js中,通常是和replace搭配,才有威力。 var reg = /(100) (99)/; var str = "100 99"; console.log(str.replace(reg,"$2 $1")); //99 100 总而言之,小括号就是让你使用分组的匹配. 说回来,分组有什么用呢? var str = "name jimmy"; console.log(str.match(/b(w+)bs+1b/)); // 这里的1 实际上就是前面的(w+) //得到的结果为 null. 因为name 不能匹配到jimmy所以为null var str = "jimmy jimmy"; console.log(str.match(/b(w+)bs+1b/)); //得到的结果为 jimmy。 因为/w匹配到的为jimmy,所以为jimmy 上面那种方法叫做后向引用. 另外,我们还可以显示的使用命名. 即: 非捕获分组我们直接使用 "(...)"进行的匹配是捕获分组。 我们来说一下什么叫捕获. 上文中我们使用match进行正则匹配,而返回的数组中的元素就是通过正则捕获的内容。 这就叫捕获。 var str=` <div class="pin"> <div class="box"> <img src="http://cued.xunlei.com/demos/publ/img/P_001.jpg" /> </div> </div>`; var reg = /<div(?:.|r|n)*div>/gi; console.log(str.match(reg)); 大家可以去试一试,说到正则匹配,我还有一个想说的,就是上文所说的惰性匹配(最少重复)和贪婪匹配。 <div class="pin"> <div class="box"> <img src="http://cued.xunlei.com/demos/publ/img/P_001.jpg" /> </div> </div> 可以看出,贪婪匹配,对于两个重复的/div 他会匹配到最外一层。 <div class="pin"> <div class="box"> <img src="http://cued.xunlei.com/demos/publ/img/P_001.jpg" /> </div> 可以看出少了一个< /div>,原因就是,惰性匹配尽量只会匹配到第一个重复的< /div>上面的。 前瞻(零宽断言)前瞻分为正向前瞻和反向前瞻。(由于js只支持前瞻,所以后瞻只会提一下)。 他的作用就是,在匹配的字符后面,断言说后面一定符合我的正则。 (好饶~~)
看不懂了吧,我们来看一下详细的内容。 var str = "happied boring"; var reg1 = /happ(?=ied)/g; var reg2 = /bor(?!ied)/; console.log(str.match(reg1)); //["happ"] console.log(str.match(reg2)); //["bor"] 从这个例子可以很容易看出前瞻后瞻到底是什么了。 var str=` <div class="pin"> <div class="box"> <img src="http://cued.xunlei.com/demos/publ/img/P_001.jpg" /> </div> </div>`; var reg = /<(?!img)(?:.|r|n)*?>/gi; console.log(str.replace(reg,"")); //得到的结果为: <img src="http://cued.xunlei.com/demos/publ/img/P_001.jpg" /> 另外,零宽断言还有另外一个作用,即匹配以xxx为结尾的单词。 var str = "he is an interested person"; var reg = /bw+(?=edb)/ig; console.log(str.match(reg)); //["interest"] 结束语关于正则的内容大概就是这些了。 其实正则的学习,不是只用看就能学会的,实践才是硬道理。 通过,理论的学习,在加上踩过的坑,自然会对正则有着莫名的好感。 不过,大神就是大神,取名字就是这么别扭。 什么 零宽断言,前瞻,后瞻,反向引用 blablabla... 在理解的同时可以根据自己的理解给这些名词冠上自己的idea.我这里只是 正则的冰山一角,正则在任意一门语言内,用处都是超级大的。这里安利一个 总结的比较好的正则库。正则库. 还有一个在线的regExp测试工具.Debuggex (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- React Native开源库react-native-image-crop-picker使用图解
- 快速掌握grep命令及正则表达式
- c# – 获取Web项目引用的类库项目中的相对文件路径
- 运行百度地图demo时出现XML file line #6: Error inflating
- flash – 为什么在Actionscript 3中调用带有2个以上参数的函
- 装饰器与耦合聚合
- OCP换题库了,最新052考试题库及答案整理-37
- ruby-on-rails – ActiveRecord :: HasManyThroughOrderErr
- 文本处理三剑客之grep(包括常用正则表达式)
- ORACLE IMP-00017: following statement failed with ORACL