正则表达式学习笔记

时间:2021-11-03 09:42:15

摘自《正则表达式必知必会》(Sams Teach Yourself Regular Expressions in 10 Minutes)


基本符号

  • .  :任何一个单个字符
  • \  :转义字符
  • \\  :匹配“\”
  • [ns]  :n或s其中一个
  • [0-9]  :0-9数字中的一个
  • [^0-9]  :任何不是数字的字符
  • [\b]  :Backspace
  • \f  :换页
  • \n  :换行
  • \r  :回车
  • \t  :Tab
  • \v  :垂直制表符
  • \d  :相当于[0-9]
  • \D  :相当于[^0-9]
  • \w  :[a-zA-Z0-9_]  
  • \W  :[^a-zA-Z0-9_]
  • \s  :[\f\n\r\t\v]
  • \S  :[^\f\n\r\t\v]
  • +  :匹配一个或者多个字符
  • *  :匹配零个或者多个字符
  • ?  :匹配零个或者一个字符
  • {8}  :匹配指定数量的字符,8
  • {2,4}  :匹配2至4个字符
  • {2,}  :匹配至少2个字符
  • .*?  :防止.*贪婪匹配(匹配可能少的字符)

位置匹配

  • 使用\b来标定单词的边界,如使用\bcap\b来匹配cap这个单词,\bcap匹配以cap开头的单词,cap\b匹配以cap结尾的单词。\b匹配的是一个这样的位置,这个位置位于一个能够用来构成单词的字符和一个不能用来构成单词的字符之间
  • \B来匹配前后都不是单词边界的位置,\B-\B匹配color - coded而不能匹配color-coded
  • ^匹配一个字符串的开头,$匹配一个字符串的结尾。^\s*<\?xml.*?\?>将识别一个文档是不是xml文档,即第一个非空行的格式是不是<?xml....?>。</[Hh][Tt][Mm][Ll}>\s*$可以检查一个HTML文件是不是以</html>结尾。
  • (?m)将开启分行匹配模式,相当于每行都是一个字符串,而不是默认的整个文件是一个字符串

使用子表达式

  • 使用()将表达式括起来当作一个独立的元素使用,如使用(\d{1,3}\.){3}\d{1,3}识别IPv4地址,包括非法的IPv4地址
  • (((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5])),匹配所有合法的IPv4地址

回溯引用匹配

  • [ ]+(\w+)[ ]+\1,匹配同一个单词的连续两次重复出现;<[hH]([1-6])>.*?</[hH]\1>,匹配HTML标签<h1></h1>等等。\1代表第一个子表达式,必须要用括号括起来
  • 替换操作,需要用到两个正则表达式,第一个用回溯引用匹配,第二个用$1代表匹配到的第1个子表达式,$2代表匹配到的第2个子表达式,以此类推
  • 大小写转换。\E,结束\L或\U转换;\l,下一个字符转为小写;\L,把\L到\E之间的字符转为小写;\u,\U则为相应的大写转换

前后查找

  • 向前查找,?=,零宽度匹配,仅仅匹配而不返回相应匹配的内容。如 .+(?=:)匹配冒号前的所有字符而不包括冒号本身
  • 向后查找,?<=,零宽度匹配,同上。(?<=\$)[0-9.]+匹配金额的数字部分,而不包括$符号
  • 前后查找取非,?!和?<!。\b(?<!\$)\d+\b,匹配字符串中不以$开头的数字部分

嵌入条件

  • 回溯引用条件,格式(?(backreference)true-regex|false-regex)),如果backreference匹配上,则执行子表达式true-regex,否则执行false-regex,这点类似于max=(a>b)?a:b。(<[Aa]\s+[^>]+>\s*)?<[Ii][Mm][Gg]\s+[^>]+>(?(1)\s*</[Aa]),把一段文本里的<IMG>标签找出来,并且如果某个<IMG>标签是一个链接(被扩在<A>和<\A>之间)的话,还要把整个链接标签匹配出来。
  • 前后查找条件,\d{5}(?(?=-)-\d{4}),可以将这样的电话号码匹配出来11111,22222,44444-4444,而33333-不会被匹配出来

常见问题的正则表达式解决方案

  • 北美电话号码:\(?[2-9]\d\d\)?[ -]?[2-9]\d\d-\d{4}
  • 美国邮政编码:\d{5}(-\d{4})?
  • 加拿大邮政编码:[ABCEGHJKLMNPRSTVXY]\d[A-Z] \d[A-Z]\d
  • 英国邮政编码:[A-Z]{1,2}\d[A-Z\d]? \d[ABD-HJLNP-UW-Z]{2}
  • 美国社会安全号码:\d{3}-\d{2}-\d{4}
  • IP地址:(((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]).){3}((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))
  • URL地址:https?://[-\w.]+(:\d+)?(/([\w/_.]*)?)?
  • 完整的URL地址:https?://(\w*:\w*@)?[-\w.]+(:\d+)?(/([\w/_.]*(\?\S+)?)?)?
  • 电子邮件地址:(\w+\.)*\w+@(\w+\.)+[A-Za-z]+
  • HTML注释:<!-{2,}.*?-{2,}>
  • JavaScript注释://.*
  • 身份证号码:[1-8]\d{5}((18)|(19)|(20))?\d{2}[0-1]\d[0-3]\d{4}[\dx]?