《正则表达式必知必会》读书笔记

引用书中的一段话:“写一个能够匹配预期内容的正则表达式并不难,但写一个能够考虑到所有场景,确保将不需要匹配的内容排除在外的正则表达式可就难多了”

所以~不能随便在网上找个正则用,因为有些黑客就是用正则来实现其不为人知的目的滴。

废话很多,进入正题吧:

1. “/g” 匹配所有;绝大多数正则表达式引擎的默认行为是只返回第一个匹配结果

2. “/i” 不区分字母大小写;正则表达式是区分字母大小写的

3. “[]” 定义一个字符合集;eg:[abc] 表示abc的合集

4. “-” 定义字符区间(元字符);ed:[0-9] 表示0123456789的合集

  注意:“-”只有出现在“[]”里才是元字符(后面6会解释什么是元字符),其他地方是普通字符,不需要被转义

5. “^” 排除某个字符集合;eg:[^0-9] 表示排除0123456789

  注意:“^”使用时位置在“[]”里的最前面,所用于[]里的所有字符

6. 元字符是一些在正则表达式里有着特殊含义的字符。如果需要匹配元字符本身,需要用“\”转义。后面会介绍到很多元字符

7. “\” 表示转义(元字符);

  注意:要匹配“\”本身:“\\”

8. “.” 匹配任何一个单字符(元字符)

9. “\d” 匹配任何一个数字;相当于:[0-9]

     “\D” 匹配任何一个非数字;相当于:[^0-9]

10. “\w” 匹配任何一个数字、字母、下划线;相当于:[a-zA-Z0-9_]

     “\W” 匹配任何一个非 数字、字母、下划线;相当于:[^a-zA-Z0-9_]

11. 匹配空白字符

  
元字符 说明
[\b] 回退(并删除)一个字符(Backspace键)
\f 换页符
\n 换行符
\r 回车符
\t 制表符(Tab键)
\v 垂直制表符

 

 

 

 

 

 引:“\r\n” 匹配一个回车+换行 组合;

  windows系统的文本行结束标记用“\r\n”表示

  而Unix/Linux以及Mac OSX系统的 文本行结束标记用“\n”表示即可

  故:匹配两条记录之间的空白行:“[\r]?\n[\r]?\n”  (“?”是元字符,后面15会解释“?”的特殊含义) 

12. “\s” 匹配任何一个空白字符;相当于:[\f\n\r\t\v]

     “\S” 匹配任何一个非 空白字符;相当于:[^\f\n\r\t\v]

  注意:用来匹配退格字符的“\b”不在“\s”的覆盖范围内,“\S”也没有将其排除

13. “+” 匹配一次或多次(元字符)

  注意:“.”和“+”元字符在[]里时可以不转义,但是转义也没有问题

14. “*”匹配0次或多次 (元字符)

15. “?”匹配0次或1次 (元字符)

16. “{数字}”匹配具体的次数(“{”和“}”都是元字符) eg:{3} 匹配3次

  “{数字,数字}”表示匹配区间 eg:{2,4} 最少匹配2次,最多匹配4次

  “{数字,}”表示至少匹配次数 eg:{3,} 至少匹配3次

17. “+”、“*”、“{数字,}”都是贪婪型,(从文本开头匹配到文本末尾,尽可能多的匹配)

  eg:一个字符串是“000<b>123</b><b>456</b>789”;正则写匹配<b>开头</b>结尾;

  贪婪型 从文本开头匹配到文本末尾 会匹配出“<b>123</b><b>456</b>”

  如果需求想要匹配出 “<b>123</b>” 和 “<b>456</b>”,就需要用到懒惰型(碰到第一个匹配的就停止,尽可能少的匹配)

  “+”的懒惰型是:“+?”

  “*”的懒惰型是:“*?”

  “{n,}”的懒惰型是:“{n,}?”:

18. “\b” 匹配单词边界(匹配的是一个位置);eg:str= "the cat is scattered" 想要匹配 “cat” 正则用 “\bcat\b” 就可以匹配出来,而“scattered” 就不会被匹配到

     “\B” 匹配一个不是单词边界的位置;

19. 匹配字符串边界: “^”代表字符串开头,“$”代表字符串结尾

  注意:“^”在 “[]” 里面,并且在最前面时,表示排除某个字符合集(参考5)

        “^”在 “[]” 外面,并且位于模式开头时,代表字符串的开头。

20. “()”表示子表达式,被包裹在“()”里的,被视为单一的实体。(“(”和“)”都是元字符)

21. “|” 或操作符;eg:“19|20” 匹配19或20

22. 反向引用 “\”

  “\1” 匹配模式中所使用的第一个子表达式

  “\2” 匹配模式中所使用的第二个子表达式

  ......以此类推

  注意:反向引用只能用来引用()里的子表达式

      “\0”代表整个正则表达式

eg: 从这段文本中,找出连续重复出现的单词 

  str= "he is a dog dog,she is is a cat cat"

  正则:[ ]+(\w+)[]+\1

  解析:“[ ]+” 匹配一个或多个空格,“(\w+)”这是一个子表达式,匹配一个或多个字母,数字或下划线, “[ ]+”匹配单词结尾的空格,“\1”匹配第一个子表达式,也就是“(\w+)”

  结果: 匹配出 “dog dog”; “is is”;  “cat cat”

23. 替换操作,用“$” 代替“\” 标识反向引用

eg:文本是:123-55-0001

       456-55-9999

       789-55-8880

  正则:(\d{3})(-)(\d{2})(-)(\d{4})  

  替换:($1) $3-$5

  结果:(123) 55-0001

     (456) 55-9999

     (789) 55-8880

24. 大小写转换

元字符 说明
\E 结束\L或\U转换
\l

把下一个字符转换为小写

\L 把\L到\E之间的字符全部转换为小写
\u 把下一个字符转换为大写
\U 把\U到\E之间的字符全部转换为大写

 

 

 


 

 

 

 

25. 环视 (这个基本上用不到,简单了解即可)

  向前查看: “?=”;向后查看 “?<=”

  否定式向前查看: “?!”;否定式向后查看 “?<!”