正则表达式

Posted 编程101

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式相关的知识,希望对你有一定的参考价值。



小编說

首先我们揭晓上一章例2的答案,使用模式(^|,)匹配锚点或者’,’,然后将其替换为’ \r\ndelete from ’即可,你的答案正确吗?



大家好,我们又见面了,不知道大家有没有练习最基本的正则表达式用法呢?希望每个人都有练习并体会到正则表达式的优雅和高效。


今天我们继续学习正则表达式,继上一章我们有了一些基础之后,本章我们会学习稍微难一点的主题,准备好了吗?Let’s Rock!


捕获与后向引用:


我们之前学习过的子表达式(),除了表明在()之间的元素属于一个单元——比如,\D\d+和(\D\d)+是不一样的两个模式,前者表明数字至少需要出现一次,后者表明非数字和数字组合至少需要出现一次——之外,还有捕获的功能。捕获的意思,就是把已经匹配成功的在()之间的串,存储在以数字1为基底的变量中。访问所捕获变量时用\1,\2进行访问。



        像\1,\2,\3等也叫做后向引用,可以出现在模式当中完成一些用其他功能比较难以实现的功能,最典型的用法就是,通过后向引用来查看文章里面有没有重复出现的单词。


正则表达式(二)


        当然,可能有人也有疑问了,难道每一个子表达式()都有捕获作用吗?默认情况下,是的,但是如果不想要某个子表达式开启捕获功能,可以使用(?:)而不是()来关闭捕获功能仅仅保留子表达式的功能,这样表达式的匹配不会受到影响,但是不会存储子表达式匹配到的串。在大部分情况下,这是提高效率的一种方式。所以如果在使用子表达式之前能很确定我们不需要捕获里面的值,就请放心的关闭捕获功能吧。


正则表达式(二)


        环视:


        环视是指不消耗文本内容而查看文本是否匹配的一种方式,有点像程序员熟悉的堆栈操作TOP,在不弹出栈底的同时查看栈底内容。这么说可能有点抽象,让我们先看看环视的定义和几个例子。


正则表达式(二)

    

        其实很好记忆,对吧?所有这四个元字符都以(?开头,如果不是否定,就用=,如果是否定,就用!。如果是后视,就再加上一个<在?后面。        


        在使用环视的场景中,有一个是比较典型的应用,我们可以拿来当例子看看。给出一个11位手机号码,要求输出格式为xxx-xxxx-xxxx的形式,我们试着用环视来完成这个功能。思考1分钟,自己试着做做,在确定自己得到答案或者不能完成的情况下,请继续往下面看。


        思考。

        思考思考。

        思考思考努力思考。


        答案揭晓!使用模式’(?<=\d{3})(?=(\d{4})+\b)’,并替换其匹配结果为’-‘,在NOTEPAD++中,这么操作



        就可以达到目的了。对这个模式的解剖分析很简单,我们就留给各位读者自己完成。不过这里有个地方需要注意,可能有些读者觉得,使用模式’(\d{3})((\d{4})+\b)’,然后使用替换串’\1-\2’也可以达到我们的目的,就像这样



        很遗憾,这样是行不通的,结果是只会输出xxx-xxxxxxxx。为什么呢?因为在这个模式中,使用的不是环视而是子表达式,所以在匹配中,整个11个数字都被消耗掉了,后面8个数字一起成为了’\2’。但是在第一个模式中,我们使用了环视,第一次匹配位置是第三个和第四个数字之间的位置,替换为-之后,匹配会继续往下进行,所以第一个模式是可行的而第二个模式不可行。请读者仔细思考环视不消耗文本的含义,这对理解这个例子是至关重要的!


        因为本章的语法对比第一章稍微有点难度,所以打算就此打住,不安排更多的内容了,请大家下来思考本章学习的捕获和环视,这是2个在实际工作中经常会使用到的技巧。希望大家多加练习。思考以下两个问题:


         1. 给单词左右加上[]。比如,输入Hello要求输出[Hello],想象这是一大堆单词。


        2. 数字格式化,要求输入100000输出100,000。


        答案将在下一章公布,同时我们下一章也会讲到贪婪匹配和占有匹配,欢迎大家的收看,我们下章见!


以上是关于正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

PHP 正则表达式总结

正则表达式

正则表达式

正则表达式“或“的使用

正则表达式 验证数字格式 非负数 小数点后保留两位 数字正则 double正则

JS正则表达式详解