我学习正则表达式的笔记

来源:互联网 发布:傲视天地宝石进阶数据 编辑:程序博客网 时间:2024/06/04 19:36

一、正则表达式的语法
要灵活运用正则表达式,必须了解其中各种元字符的功能,元字符从功能上大致分为:
  1,限定符
 2,选择匹配符
 3,分组组合和反向引用符
 4,特殊字符
 5,字符匹配符
 6,定位符

限定符:用于指定前面的字符或组合项连续出现多少次。
1,{n}
举例说明:“o{2}”不能与“Bob”中的“o”匹配,但可以与“food”中的两
个“o”匹配,也可与“fooood”中的任意两个连续的“o”匹配。
2,{n,}
举例说明:“o{2,}”不能与“Bob”中的“o”匹配,但可以与“foooood”中的所有
的“o”匹配。
3,{n,m}
举例说明:“o{1,3}”既可匹配“food”中的两个“o”,又可匹配“fooood”中的
连续的三个“o”。
4,+ (前面的元素或组合项至少出现一次)
举例说明:“zo+”与“zo”和“zoo”等在字母之z后面连续出现一个或多个字母
O的字符串匹配。(等效如{1,})
5, *(前面的元素或组合项至少出现0次或多次)
举例说明:zo*与“z”和“zoo”都能匹配。*等效于{0,}。
6,?(规定前面的元素或组合项出现0次或1次)
举例说明:“zo?”可以匹配“z”或“zo”,也可以匹配“zoo”中的“zo”部分
,但不能匹配整个“zoo”。(等效于(0,1))


贪婪匹配与非贪婪匹配
1. 贪婪匹配
默认情况下,正则表达式使用最长(也叫贪婪)匹配原则。例如,要将
“zoom”中匹配“zo?”的部分替换成“r”,替换后的结果是“rom”
不是“room”;如果要将“zoom”中匹配“zo”部分替换成“r”,替换后的结果
是“rm”,不是“rom”或“room”。
2. 非贪婪匹配
当字符“?”紧随任何其他限定符(*、+、?、{n}、{n,}、{n,m})之后时,
匹配模式变成使用最短(也叫非贪婪)匹配原则。例如,在字符串“fooood”
中,“fo+?”只匹配“fo”部分,而“fo+”匹配“foooo”部分。


选择匹配符:
选择匹配符只有一人,就是“|”字符,用于选择匹配两个选项之中的任意一个,
它的两个选项是“|”字符两边的尽可能最大的表达式。
     举例说明:
         “chapter|section 1”匹配的是“chapter”或“section 1”,而不是
          “chapter 1”或“section 1”;如果要匹配“chapter 1”或“section 1”,
           应该使用括号创建子表达式,即“(chapter|section)1”。

 

分组组合和反向引用符:
    分组组合符:将正则表达式中的某一部分内容组合起来的符号。
    反向引用符:用于匹配前面的分组组合所捕获到的内容的标识符号。

   
• (pattern)(存入缓冲区)
     说明:若要匹配字面意义的括号字符“(”和“)”,在正则表达式中要分别
     使用“/(”和“/)”。
•  /num
     举例说明:要匹配连续的5个数字字符,可以使用/d{5}作为是正则表达式文本
     但是,要匹配连续的的5个相同的数字字符,需要使用(/d)/1{4}作为正则表达式文本。要匹配“Is is the cost of of gasoline going up up?”中所有连续重复的单词部分,可以使用//b([a-z]+)/1/b/gi作为正则表达式文本。
•  (?:patterm)(不存入缓冲区)
     举例说明:不能将“industry|industries”简单地改写成“industr(y|ies)”,
     如果不需要引用或检索括号中的表达式所匹配的结果,最好还是改写成“industr(?:y|ies)”。
•   (?=pattern) 
      正向“预测先行”匹配
      举例说明:使用“Windows(?=NT|2000)”作为正则表达式模式,它只与“Windows 2000”或“Windows NT”中的“Windows”匹配,而不与“Windows 2003”中的“Windows”匹配。
       ?多想一想:以“Windows(?=NT|2000)Series”作为正则表达式模式,在文本“My Windows NT Series”中的匹配结果是多少呢?

•   (?!pattern)
      反向“预测先行”匹配
      举例说明:使用“Windows(?!NT|2000)”作为正则表达式,它不与“Windows 2000”或“Windows NT”中的“Windows”匹配,而可以与“Windows 2003”中的“Windows”匹配。


特殊字符
       正则表达式中以反斜杠字符(/)后紧跟其它转义字符序列来表示非打印
       字符和原义字符。
    
     •   /xn
            ASCⅡ码值等于n的字符,这里的 n必须是两位的十六进制数
举例说明:“/x41”匹配字符“A”。注意:“/x041”所表示的字符
            后跟字符“1”。
      •     /n
             要求这里的n(0-7)是一个一位的八进制数,如果这里的n前面至少
             有n个捕获子匹配,那么这个斜杠n它就是被用作反向引用,否则它就是被
             用作匹配ASCII码值等于这个n的字符
      •     /nm
              这里的m和n都是一位的八进制数如果在这个表达式的前面至少有nm个捕获子表达式,那么这个格式就是反向引用,如果前面至少有n个捕获,那么这个表达式的/n部分就是反向引用,那么后面m就是字面意义上的数字字符了,如果刚才说的那些条件都不存在,那么它才是匹配ASCII码的值的八进制形式等于nm的那个字符
      •     /nml
              当n是0到3之间的八进制数和m和l是0到7之间的八进制数的时候,它才能匹配ASCII码值的八进制形式等于nml的那个字符。
      •     /un
              用来匹配Unicode码等于n的字符,这里的n必须是一个四位的十六进制数据
              举例说明:/u00A9匹配版权符号。
      •     /CX
              匹配由X所指定的控制字符。这个X的值必须是大写的A到Z或
              小写的a到z之间的一个字符,否则这个C完全是字面意义上的字符
               C本身,X是原来的字符意义了,而不再表示控制字符了
              举例说明:/cM匹配Control+M表示的控制字符,也就是回车符。
      •     /f 
              匹配换页符,等效于/x0c和/cL。
      •     /n
              匹配换行符,等效于/x0a和/cJ。
      •     /r
              匹配回车符,等效于/x0d和/cM。
      •     /t
              匹配制表符,等效于/x09和/cl。
      •     /v
              匹配垂直制表符,等效于/x0b和/cK。

字符匹配符
字符匹配符:用于指定该符号部分可以匹配多个字符中的任意一个。
• […]
说明:如果字符集中要包含“]”字符,需要将它放在第一位,即紧跟在开始“[”后面。[…]中的字符“/”仍然作为转义符,若要在[…]中包含“/”本身,需要使用“//”。
•  [^…]
     说明:只要字符“^”不是出现在第一个“[”后面,它就是还是字面意义上的“^”。
•   [a-z]
     说明:要在中括号表达式中包括字面意义的连字符(-),可以用反斜杠(/)将它
     标记为原义字符,例如,[a/-z],但此时指的是三个字符了。也可以将连字符(-)放在方括号的开始或结尾处,例如,[-a-z]或[a-z-]。
•   [^a-z]
•    /d
      可以匹配任意一个数字字符。
•    /D
      它可以匹配一个非数字字符。
•    /s   等效于[ /f/n/r/t/v]。
      它可以匹配任何空白字符。
•    /S   等效于[^/f/n/rt/v]。
      它可以匹配任何非空白的字符。
•    /w   等效于[A-Za-z0-9_]。
      它可以匹配任何英文字母和数字类的字符以及下划线。
•    /W   等效于[^A-Za-z0-9_]。
•    .
      它可以匹配除了/n以外的单个任何字符。
      说明:“(.)/1”匹配除了“/n”以外的两个连续的相同的字符。若要匹配
      包括“/n”在内的任意字符,可以使用“[/s/S]”,“[/d/D]”或“[/w/W]”
      等模式。若要匹配“.”字符本身,需要使用“/.”。
     

定位符 
定位符:用于规定匹配模式在目标字符串中的出现位置。
•   ^
     用于匹配目标字符串的开始位置,规定匹配必须发生在目标字符
     串的开始位置上。
     举例说明:“^o”与“ok”中的“o”匹配,但与“hello”中的
     “o”不匹配。如果设置了RegExp对象实例的Multiline属性,
     ^还会与行首匹配,即与“/n”或“/r”之后的位置匹配。
•   $
     用于匹配目标字符串的结尾位置,规定匹配必须发生在目标
     字符串的结尾。这个$ 只能写在表达式的末尾才能发生此作用。
     举例说明:“o$”与“hello”中的“o”匹配,但与“ok”中的
     “o”不匹配。如果设置了RegExp对象实例的Multline属性,
      $还会与行尾匹配,即与“/n”或“/r”之前的位置匹配。
  •  /b
       它可以匹配一个字边界,也就是一个单词的边界。
       它包含了字与空格间的位置以及目标字符串的开始和结束等位置。
       举例说明:“er/b”匹配“never ok”中的“er”,但不匹配“verb”
       中的“er”。
  •  /B
        用来匹配非字边界的情况。
举例说明:“er/B”匹配“verb”中的“er”,但不匹配“never”中的“er”。

原义字符
     在正则表达式中用到的一些元字符不再表示它原来的字面意义,如果要匹配这些具有特殊意义的元字符的字面意义,必须使用反斜扛(/)将它们转义为原义字符,即将反斜杠字符(/)放在它们前面。

      需要进行转义的字符:
      “$”、“(”,“)”、“*”、“+”、“.”、“[”、“]”、“?”、“/”、“/”、“^”、“{”、“}”、“|”


优先级顺序
     正则表达式从左到右进行计算,并遵循优先级顺序。例如,“*”比字符的优先级高,“ab*”是“b”和“*”组合后、再和前面的“a”组合。“()”比“*”的优先级高,“(ab)*”是“a”和“b”组合后、再和后面“*”组合。字符比“|”的优先级高,“a|bc”是“b”和“c”组合后,再和前面的“a”进行选择组合,是“a”和“b”进行选择组合,再和后面的“c”组合。

 

一些正则表达式范例:
   •   匹配空行: /^/s*$/
   •   匹配HTML标记: /<(/S+)(/s[^>]*)?>[/s/S]*<///1/s*>/
   •   匹配email地址: /[a-zA-Z0-9_-]+@[ a-zA-Z0-9_-]+(/.[ a-zA-Z0-9_-]+)+/
   •   匹配两个相同的相邻单词: //b([a-z]+/1/b)/
   •   匹配ip地址:/^(/d{1,2}|1/d/d|2[0-4]/d|25[0-5])(/.(/d{1,2}|1/d/d|2[0-4]/d|25[0-5])){3}$/

原创粉丝点击