无我忘我吧 关注:8贴子:2,605

【学习笔记】正则表达式

只看楼主收藏回复

正则表达式是一个功能非常强大的信息处理的辅助工具,没有它,很多工作一样可以做,但是有了它,很多工作将会变得极其简单。
想要真正地理解正则表达式,其实并非一件容易的事,尤其是对其思想的充分理解及融会贯通。专门花时间来学习“非必要的”的技能,以后往往能够有意想不到的收获。
开个贴子,来记录一些东西,时不时做一些总结,也非常的重要。I


1楼2013-10-11 17:16回复
    又可以涨见识了


    来自iPhone客户端2楼2013-10-11 17:30
    收起回复
      完整的正则表达式有两种字符构成,元字符(metacharacters)和普通文本字符(normal text characters)构成。
      而元字符,是需要深深地记在脑海里的。


      4楼2013-10-12 14:54
      回复
        字符组(character class)
        它容许使用者列出在某处期望匹配的字符,用结构体(construct)[]来呈现。
        字符组内部的元字符(character-class metacharacter)与其外面的元字符规则是不同的:
        “-”(连字符)只有在字符组内部,才有可能是元字符,而且如果不是用来表示范围的时候,例如出现在字符组的开头,那么它只是一个普通的字符。
        问号和点号及其他在字符组外通常做为元字符的字符,而在字符组内部,它们只是普通的字符。
        “^”(脱字符)出现在字符组内部,而且必须是字符组的第一个字符出现的时候,它就是一个元字符,表示排除,除了字符组中的字符以外的字符。而非第一个位置出现,它只是一个普通的字符。
        例子:
        [0-9A-Za-z.?!-]
        [^abc]I


        5楼2013-10-12 15:18
        回复
          元字符总结(for egrep):
          . 匹配单个任意字符
          [] 匹配单个字符组中的字符
          [^] 匹配单个未列出的字符
          \char 转义字符,若char是元字符,或转义序列无特殊含义时,匹配char对应的普通字符
          ? 表示计数功能,零次或一次
          * 表示计数功能,可以匹配任意多次,也可以不匹配
          + 表示计数功能,一次或者多次
          {min,max} 区间量词,至少需要min次,至多容许max次
          ^ 匹配一行的开头位置
          $ 匹配一行的结束位置
          \< 匹配单词的开始位置(有的支持,有的不支持)
          \> 匹配单词的结束位置(有的支持,有的不支持)
          | 匹配任意分割的表达式
          () 限定多选结构的范围,标注量词作用的元素,为反向引用提供捕获文本
          \1,\2, ...匹配之前的第一,第二组括号内的子表达式匹配的方本I


          6楼2013-10-12 15:47
          回复
            匹配重复单词的正则:\<([a-zA-Z]+) +\1\>


            7楼2013-10-12 16:03
            回复
              正则术语:匹配(matching)
              一个正则表达式匹配一个字符串,是指这个正则表达式能在字符串中找到匹配文本。来格地说,正则表达式/a/不能匹配cat,但是能匹配cat中的a


              8楼2013-10-14 10:45
              回复
                匹配24小时制时间的正则:
                /([01]?[0-9]|2[0-3]):[0-5][0-9]/


                9楼2013-10-14 10:51
                回复
                  -i 参数经常会很有用,表示匹配时忽略大小写,但它不属于正则表达式的一部分
                  转义字符\有三种情况:
                  1. 加在元字符前面,则表示匹配由元字符对应的普通字符
                  2. 加在非元字符前面,组成一种由具体实现方式规定的元字符序列,例如\<表示单词的起始边界
                  3. 加在普通字符的前面,默认情况就是匹配此字符,此时毫无意义


                  11楼2013-10-14 11:28
                  回复
                    刚刚写了一个匹配IP地址的正则表达式:
                    /^([0-9]|[1-9][0-9]|(1[0-9][0-9]|(25[0-5]|2[0-4][0-9])))(\.([0-9]|[1-9][0-9]|(1[0-9][0-9]|(25[0-5]|2[0-4][0-9])))){3}$/


                    12楼2013-10-16 12:26
                    回复
                      非捕获型括号:
                      (?:…)
                      这样写通常表示只分组而不捕获
                      好处主要是:
                      避免了不必要的捕获操作,提高了匹配的效率
                      坏处主要是:
                      这种写法不够美观,增加了整个表达式的阅读难度


                      13楼2013-10-16 14:45
                      回复
                        Perl和其他流派的正则表达式提供了许多有用的简记法(shorthands):
                        \t 制表符
                        \n 换行符
                        \r 回车符
                        \s 空白符
                        \S 除空白符之外的其它字符
                        \w [a-zA-Z0-9]
                        \W [^a-zA-Z0-9]
                        \d [0-9]
                        \D [^0-9]


                        14楼2013-10-16 15:07
                        回复
                          其实到现在为止,我已经隐约明白了一点正则的思想,正则要求的是思维的条理性和全面性,一方面考虑如何匹配,另一方面考虑排除不匹配。此时我不得不佩服正则的简捷与优雅,一行正则,如果换成程序语言,可能会变得庞杂许多。


                          15楼2013-10-16 15:11
                          回复
                            另一个正则的例子,处理浮点数,将股票价格修正为保留两位小数或者三位小数,如果第三位小数为零,则保留两位,否则保留三位:
                            $price =~ s/(\.\d\d[1-9]?)\d*/$1/


                            本楼含有高级字体16楼2013-10-17 10:15
                            回复
                              正则表达式一个有趣的功能,环视(look around):
                              环视结构不匹配任何字符,只匹配文本中的特定位置,而不占用字符,这一点与单词分界符(\b),锚点(^)和$相似。
                              其中一种类型叫做顺序环视,作为表达式的一部分,顺序环视,从左至右查看文本,尝试匹配子表达式,如果能够匹配,就返回匹配成功的信息。
                              肯定型顺序环视(positive lookahead)用特殊的序列/(?:…)/来表示,例如/(?:\d)/,如果当前的位置右边的字符是数字则匹配成功。
                              另一种类型为逆序环视,它从右向左查看文本,用特殊的序列/(?<=…)/来表示,例如/?<=\d/表示当前位置左边有一位数字,则匹配成功,也就是说,紧跟在数字的后面的位置。


                              本楼含有高级字体18楼2013-10-17 18:17
                              收起回复