《正则表达式必知必会》读书笔记
引用书中的一段话:“写一个能够匹配预期内容的正则表达式并不难,但写一个能够考虑到所有场景,确保将不需要匹配的内容排除在外的正则表达式可就难多了”
所以~不能随便在网上找个正则用,因为有些黑客就是用正则来实现其不为人知的目的滴。
废话很多,进入正题吧:
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. 环视 (这个基本上用不到,简单了解即可)
向前查看: “?=”;向后查看 “?<=”
否定式向前查看: “?!”;否定式向后查看 “?<!”