0.问题引入
    字符串是计算机应用中最为广泛的处理对象之一(浏览器,xml文件,代码===)
     并且字符串的组合规则形式各种各样,如:
             数字字符串
             email字符串
             IP地址字符串
             网址
             ......
         
         这些都是我们程序设计需要去处理的对象,现在的问题是:
             计算机要处理这些字符串,首先要用某种语言(表达式,数据类型)
             去描述这些字符串的规则
        ===> 世界标准
                  正则表达式
1.正则表达式
         它究竟是个啥玩意?
                 正则表达式是用来描述某种规则字符串的表达式        
                 脱离了具体语言的一些规则,但是现在大多数的程序设计语言都实现了
                      C/C++
                      python
                      C#
                      ....
                     
                     但是每种语言中实现正则表达式的规则略有不同              
 2.正则表达式的规则
 
        正则表达式是描述某种规则字符的表达式。
        
         如:
              十进制数字字符串
               [0-9]+
                      表达的含义: 有一个或者多个0-9的字符组合而成的字符串。
        正则表达式也叫做匹配模式,它是由一组特定含义的字符串组成,
         通常用于匹配和替换文本
        在正则表达式中的字符,分为两种:
                 (1)普通字符 :只代表自己本身含义的字符
                 
                 (2)元字符 : 有特定的含义(不代表自己)的字符
                         
                         正则表达式中的元字符:
                              . 匹配任意单个字符
                                 如果你想要表达'.'的含义
                                 需要转义 \.
                                 
                              [] 字符组
                                 虽然由多个字符构成,但是它仍然只匹配单个字符。
                                 字符组能够匹配的单个字符,都在[]内列举出来。
                                 []仅匹配括号里面的一个字符
                                 
                                 例子:
                                      [0123456789abcdefABCDEF]
                                               表达的含义:匹配一个 十六进制的字符
                                 [] 字符组里面也有一个元字符 : -
                                  - : 在[]内用于连接ASCII连续的字符
                                 
                                  练习:  
                                        写一个正则表达式,用于表达一个十六进制字符
                                          [0-9a-fA-F]
                                  练习:写一个正则表达式,用来描述一个可以作为C语言中描述符的字符
                                          数字,字母,_
                                          [0-9a-zA-Z_]
                                 
                                [^] 排除字符组
                                   匹配单个字符,匹配除[]内,外面的所有的字符中的单个字符
                                   如:
                                       非十进制数字字符                                      
                                       [^0-9]
                                       
                               \d: digtial
                                   匹配单个十进制数字字符
                                   \d <==> [0-9]
                               \D: Digtial
                                   匹配单个非十进制数字字符
                                   \D <==> [^0-9]    
                               \w: word
                                   匹配单个单词中能够出现的字符    
                                   字母,_,数字
                                   \w <==>[a-zA-Z_0-9]
                               \W:
                                   匹配单个非字母,数字,_
                                   \w <==>[^a-zA-Z_0-9]
                               \s: 匹配单个空白符
                                   \s <==>[\f\n\r\t\v]
                                    
                                    \f --> 换页符
                                    \n --> 换行符
                                    \r --> 回车符
                                    \t --> 制表符
                                    \v --> 垂直制表符
                              \S: 匹配单个非空白符
                                   \S <==>[^\f\n\r\t\v]    
    
                             例子:
                                   [a-z^0-9]
                                   表达的含义:
                                              匹配单个 a-z,^,0-9    
                                              如果^是排除的话,‘^’放在最前面。                                            
                                
                         匹配多个字符:
                         +  匹配一个或多个先前字符(或模式)
                             如:
                                09+
                                   =>
                                      09
                                      099
                                      0999
                                      09999
                                      ......
                                [0-9]+
                                   =>
                                      [0-9]
                                      [0-9][0-9]
                                      [0-9][0-9][0-9]
                                      .......
                         * 匹配0个或多个先前的字符(或模式)
                            如:
                                 09*
                                    =>0
                                      09
                                      099
                                      0999
                                      .....
                                [0-9]*
                                    =>
                                       "" -> 空串
                                       [0-9]
                                       [0-9][0-9]
                                       [0-9][0-9][0-9]
                        ? 匹配0个或1个先前的字符(或模式)
                            如:
                                 09?
                                  =>0
                                    09
                                    
                                 [0-9]?
                                  => ""
                                     [0-9]                                
                         
                         {数字} 匹配固定数目的字符(或模式)
                             如:
                                 88[0-9]{3}
                                   =>
                                      88[0-9][0-9][0-9]
                         
                         {最小数目,最大数目}
                                匹配至少“最小数目”,至多到“最大数目”的先前字符(或模式)
                                 如:
                                     8{1,3}
                                        => 8
                                           88
                                           888
                         
                         {最小数目,}
                                 匹配至少“最小数目”,上不封顶的先前字符(或模式)
                                 如:
                                     abc{1,} <==> abc+
                                         =>
                                            abc
                                            abcc
                                            abccc
                                            ......
                         
                         () 作为一个整体,子模式
                                 如:
                                     (abc){1,3}
                                         ==>
                                            abc
                                            abcabc
                                            abcabcabc
                                            
                         (|) 二选一
                                 如:
                                     (123|abc){2}
                                         ==> 123123
                                             123abc
                                             abc123
                                             abcabc
                 转义元字符:
                         \元字符  => 元字符就不是元字符了,就变成了普通字符
                             如:
                                 \. 代表一个普通字符‘.’
                                 \* 代表一个普通字符‘*’
                                 ....
                练习:
                       1.用正则表达式描述你C语言代码中出现的十进制数字字符串
                       
                         [0-9]+
                         
                       2.请用正则表达式描述一个十六进制数字 < 2^32 的十六进制数字字符串。
                             0x / 0X
                                   
                                  0x0
                                  0x00
                                  0x1....
                                  ....
                                  ...
                                  0xffffffff
                                 
                         0[xX][0-9a-fA-F]{1,8}