关于正则,之前总结过一篇基础知识的文章《js正则使用总结》,但是每次在项目中遇到正则的问题的时候,总是感觉捉襟见肘。方领悟到,正则的难,不在于基础知识。而是在于实际问题的灵活和变化,让人总会遇到新的问题。
下面基于之前所总结的正则基础知识,结合一些实践的应对步骤,相信再次遇到实践问题的时候,一定可以事半功倍。俗话说“活好不如家伙事妙”,其实遇到正则问题时可以把问题抽象出来,在工具网站( c.runoob.com/front-end/8… )上来重点解决我们的问题,经过多方对比,这个网站的字号看着输入,表达式预留位置大小比较合理,所以我们以这个网站为例子来进行讲解。在上一篇文章的结尾,我们总结了关于正则常用的操作有三个:
正则替换:stringObject.replace(regexp/substr,replacement)//请注意,如果该值是一个字符串,则将它作为要检索的直接量文本模式,//而不是首先被转换为 RegExp 对象,因为无法和substr区分。//这点跟str.match(regexp)不同。
捕获组:str.match(regexp)//如果使用g标志,则将返回与完整正则表达式匹配的所有结果,但不会返回捕获组。//如果未使用g标志,则仅返回第一个完整匹配及其相关的捕获组(Array)。//如果你需要知道一个字符串是否与一个正则表达式匹配 RegExp ,可使用 RegExp.test()。
判断是否匹配:regexObj.test(str)//如果正则表达式与指定的字符串匹配 ,返回true;否则false。
回到这个网站,我们看到界面也很简洁,就两个主要功能,测试匹配和替换,我们可以在正则表达式的位置填写正则表达式,然后把我们要测试的文本写在下方,点击测试匹配,就可以显示出匹配的文本和一共有几处匹配。
填写要替换的文本,点击“替换”,就可以获取到replace函数处理之后的结果。
下面我们通过调试网站源码来看的更清晰一点,源码中比较关键的有三个函数,通过断点调试,我们可以看到在点击完匹配测试以后,源码中先是构造了正则,然后拿着构造的正则去执行match操作。如果结果数组的长度result.length不为0,那么就说明匹配。(此处要显示匹配的详细信息,所以用了match。)而在替换的逻辑中,直接拿到实例化出来的正则表达式,执行了replace方法,进而完成替换。调试源码的意义是什么呢?在调试完正则,拿到满意的结果后,我们就可以根据网站实例化出来的正则表达式,直接用到代码中。
其实,当我们想观察match方法返回的捕获组时,同样可以借助网站的源码。虽然结果不会显示出来,但是我们同样可以借助断点,查看局部变量,来观察捕获组的结果。