zoukankan      html  css  js  c++  java
  • 正则表达式基础知识

    一、行的起始和结束

    正则表达式中,最容易理解的元字符或许就是脱字符号/^/和美元符号/$/。

    在检查一行文本时,/^/代表一行的开始,/$/代表一行的结束

    例如,正则表达式/cat/寻找的是一行文本中任意位置的c·a·t,但是/^cat/只寻找行首的c·a·t

      —— /^/用来把匹配文本“锚定”在这一行的开头。同样,/cat$/只寻找行末的c·a·t,例如以 scat 结尾的行。

    脱字符号和美元符号的特别之处就在于,他们匹配的是一个位置,而不是具体的文本。


     二、字符组

    1、匹配若干字符之一

    无论字符组中的内容有多少,一个字符组只匹配目标文本中的单个字符

      如果我们需要搜索的是单词“grey”,同时又不确定它是否写作“gray”,就可以使用正则表达式结构体/[···]/。它容许使用者列出在某处期望匹配的字符,通常被称作字符组。/e/匹配字符e,/a/匹配字符a,而正则表达式/[ea]/匹配字符a或者e。所以,/gr[ea]y/的意思是:先找到g,跟着是一个r,然后是一个a或者e,最后是一个y。

      请注意,在字符组以外,普通字符都有“接下来是”的意思——“首先匹配g,接下来是r……”。而字符组的内容是在同一个位置能够匹配的若干字符,所以它的意思是“或”。
    在一个字符组中可以列举任意多个字符。例如/[123456]/匹配1到6中的任意一个数字。

    连字符:

      在字符组内部,字符组元字符‘-’(连字符)表示一个范围:/[1-6]/与/[123456]/是完全一样的。/[0-9]/和/[a-z]/是常用的匹配数字和小谢字母的简便方式。

    多重范围:

      字符组内部,多重范围也是容许的,例如/[0123456789abcdeABCDE]/可以写作/[0-9a-eA-E]/(或则也可以写作/[a-eA-E0-9]/,顺序无所谓)。我们还可以把字符范围与普通文本结合起来:/[0-9a-z_!.?]/用来匹配一个数字、小写字母、下划线、惊叹号、点号或者是问号。

    请注意:

      只有在字符组内部,并且不处于字符组的开头,连字符‘-’才是元字符——否则它就只能匹配普通的连字符号。并且点号和问号都是普通字符。

      同样的道理,问号和点号通常被当作元字符处理,但在字符组中咋不是如此(说明白一点,/[0-9a-z_!.?]/里面,真正的特殊字符就只有那两个连字符)。

      不妨把字符组看作是独立的微型语言。在字符组内部和外部,关于元字符的规定(哪些是元字符,以及它们的意义)是不同的。

    2、排除型字符组

      用/[^···]/取代/[···]/,这个字符组就会匹配任何列出的字符。

      例如,/[^1-6]/匹配除了1到6以外的任何字符。这个字符组中开头的/^/表示“排除”


     三、用点号匹配任意字符

      元字符/./(通常称为点号)是用来匹配任意字符的字符组的简便写法。如果需要在表达式中使用一个“匹配任何字符”的占位符,用点号就很方便。


     四、多选结构

      /|/是一个非常简洁的元字符,它的意思是“或”(or)。依靠它,我们能够把不同的子表达式组合成一个总的表达式,而这个总的表达式又能够匹配任意子表达式。例如/Bob/和/Robert/是两个表达式,但/Bob|Robert/能够同时匹配其中任意一个的正则表达式。在这样的组合中,子表达式称为“多选分支”

      回头来看/gr[ea]y/的例子,有意思的是,它还可以写作/gray|grey/,或者是/gr(a|e)y/。后者用括号来划定多选结构的范围(正常情况下,括号也是元字符)。请注意,/gr[a|e]y/不符合我们的要求——在这里,‘|’只是一个和a与e一样的普通字符。


     五、可选项元素

      现在来看color和colour的匹配。它们的区别在于,后面的单词比前面的多一个u,我们可以用/colou?r/来解决这个问题。元字符/?/(也就是问号)代表可选项。把它加在一个字符后面,就表示此处容许出现这个字符,不过它的出现并非匹配成功的必要条件(即此处这个字符允许出现0次或1次)。

      /u?/这个元字符与我们之前看到的元字符都不相同,它只作用于之前紧邻的元素


     六、其他量词:重复出现

      /+/(加号)和/*/(星号)的作用与问号类似。

      元字符/+/表示“之前紧邻的元素出现一次或多次”,而/*/表示“之前紧邻的元素出现任意多次,或者不出现”

      问号、加号和星号这3个元字符,统称为量词,因为它们限定了所作用元素的匹配次数。


     七、规定重现次数的范围:区间

      正则表达式中能够使用元字符序列来自定义重现次数的区间:/{min,max}/,这称为“区间量词”

      例如,/···{3,12}/能够容许的重现次数在3到12之间。


    八、转义

      如果需要匹配的某个字符本身就是元字符,正则表达式改如何处理呢?

      例如,我想要检索互联网的主机名ega.att.com,使用/ega.att.com/可能会得到megawatt_com的结果。

      因为/./(点号)本身就是元字符,它可以匹配任何字符,包括空格。

      真正匹配文本中点号的元序列应该是反斜线加上点号的组合:/ega.att.com/。

      /./称为“转义的点号”或者“转义的句号”,这样的办法适用于所有的元字符,不过在字符组内部无效


     九、元字符总结:

    匹配单个字符的元字符
    . 点号 匹配单个任意字符
    [···] 字符组 匹配单个列出的字符
    [^···] 排除型字符组 匹配单个未列出的字符
    char 转义字符 若char是元字符,或转义序列无特殊含义时,匹配char对应的普通字符
    提供计数功能的元字符
    ? 问号 0次或1次
    * 星号 任意多次
    + 加号 1次或多次
    {min,max} 区间量词 至少min次,之多max次
    匹配位置的元字符
    ^ 脱字符 匹配一行的开头位置
    $ 美元符 匹配一行的结束位置
    其他元字符
    | alternation 匹配任意分隔的表达式
    (···) 括号 限定多选结构的范围,标注量词作用的元素,为反向引用“捕获”文本

       

      在web开发中肯定会用到正则表达式,而正则表达式我还未认真学过,仅仅靠W3school和菜鸟教程上正则的讲解远远不能让我能读懂公司祖传的正则表达式,因为网上的这些教程忽略了很多细节和很重要的理解正则表达式的思想:正则表达式是按照一个一个字符来匹配的,具体看我上一篇博客,因此我便在公司借了这本书来读,书写的很好,作者的逻辑很强,跟着作者的思路走,正则的基础知识能够一点一点理解到位。

      第一章读了一遍,便决定写成一篇博客,以方便以后的回顾或者其他读者的学习参考。

      考虑到日常的开发中,需要自己动手写正则表达式的机会不是很多,并且公司已经封装了常用的正则,因此此次的学习的目标是掌握正则表达式的基础知识,能够读懂分析正则表达式即可,以后如果需要深入地使用正则表达式,可以把这本书买下来,继续看。

     参考书籍:《精通正则表达式》(推荐)

  • 相关阅读:
    Leetcode 18. 4Sum
    Leetcode 15. 3Sum
    Leetcode 16. 3Sum Closest
    String类型的理解
    求字符串中某个字符出现的次数
    用StringBuilder来实现经典的反转问题
    String/StringBuilder 类 用对象数组实现登录注册功能
    String/StringBuilder 类 统计字符串中字符出现的次数
    String/StringBuilder 类 判断QQ号码
    C++ 面向对象: I/O对象的应用
  • 原文地址:https://www.cnblogs.com/daihu/p/10215215.html
Copyright © 2011-2022 走看看