最简单正则表达式入门
1、正则表达式的作用:正则表达式是用于处理字符串的一种规则。比如说你看到一大篇文章,密密麻麻的文字看得你头大,而这篇文章中的绝大部分内部都是你不关心的。这时候,正则表达式就可以发挥作用了:1. 首先,你可以为你感兴趣的内容制定一个公式(如:这个公式为,包含‘金额’两个字的句子);2. 然后,使用正则表达式在文章中自动去搜索与你制定的公式相吻合的所有句子;3. 最后,把找到的符合规则的句子展示在你的眼前。这下你就可以针对找到的内容作出进一步处理了。那怎么来按制定这样公式呢?这就是今天要讲的主要内容,请往下看。
2、你关心的内容可能有哪些:这里大概列举一下日常的需求,带着这些需求来学习后面的内容,不会觉得枯燥,也不容易跑偏:1. 找到手机号;2. 找到邮箱地址;3. 找到一个单词(如人名,地址等);4. 找到一个包含几个特征的句子(如句子中既要有重庆又要有火锅等词汇)。当然上面提到的只是所有需求中几个常见的例子,需求是枚举不完的,每个人都是自己不同的需求。我们要关注的重点是“怎么把这些需要转化成计算机能够识别的公式”。
3、公式符号 - 字符:1. 【一般字符】:代表自己本身,如:abc,就在句子中去匹配abc。2. 【.】:匹配除换行符以外的任意字符3. 【[...]】:字符集。匹配[]中的任一字符,如:a[bcd]e,在句子中匹配abe,ace,ade都可以。如在第一位加上^号,则不匹配字符集中的任意字符,如:a[^bcd]e,表示匹配abe,ace,ade以外的。
4、公式符号 - 预定义字符:4. 【\d】匹配数字 = [0-9]5. 【\D】匹配非数字 = [^0-9] 或 [^\d]6. 【\s】匹配任意的空白符 = [空格\t\r\v\f\n]7. 【\S】匹配非空白符 = [^空格\t\r\v\f\n]或 [^\s]8. 【\w】匹配字母或数字或下划线或汉字 = [a-zA-Z0-9_]9. 【\W】匹配非单词 = [^a-zA-Z0-9_]或 [^\w]
5、公式符号 - 量词:10. 【*】匹配前一个字符0次或以上,如:ab*,可匹配a,ab,abbbb等11. 【+】匹配前一个字符1次或以上,如:ab+,可匹配ab,abbbb等12. 【?】匹配前一个字符0次或1次,如:ab?,可匹配a,ab13. 【{m}】匹配前一个字符m次,如:ab{2},可匹配abb14. 【{m, n}】匹配前一个字符m次至n次,如m不写则m默认为0,如n不写则n默认为正无穷。分别记为:{, n},{m, }。15. 【?】如果?出现在【*】【+】【?】【{m}】【{m, n}】的后面,表示以非贪婪模式匹配。如:ab+匹配abbbb就是贪婪匹配,有多少b都匹配上。而ab+?为非贪婪匹配,只要到ab就算成功了,b后面是否还是b就不关心了。
6、公式符号 - 边界:16. 【^】匹配字符串的开始。注意与[]中的[^]区别,[^]中的表示非括号内的字符。多行模式中匹配每一行的开头。17. 【$】匹配字符串的结束。多行模式中匹配每一行的结束。18. 【\A】匹配字符串的开始。19. 【\Z】匹配字符串的结束。20. 【\b】匹配单词的开始或结束。21. 【\B】= [^\b]
7、公式符号 - 逻辑,分组:22. 【|】表或者,如:abc|def,先匹配abc,如果成功了就忽略掉d髫潋啜缅ef,如果没成功就匹配def。没有找到,则匹配失败。23. 【(...)】分组。每个级有一个编号从1开始,每遇到一个左括号,编号加1。如:a(bc){2}匹配abcbc;a(b|c)匹配ab或ac。24. 【(?P<name>)】只是为上面的分组再加一个别名。如a(?P<id>bc){2}。25. 【\number】引用编号为number的分组得到的字串。如:a(bc)d\1匹配abcdbc。26. 【(?P=name)】引用别名为name的分组得到的字串。如:a(?P<id>bc)d\(?P=id)匹配abcdbc。
8、公式符号 - 特殊构造:2蚀卺垦肝7. 【(?:)】这个不表分组,只是集中一个公式,如:(?:ab){2}匹配abab。飧肇苡卫只是为了把ab集中写到一起方便。28. 【(?iLmsux)】其中iLmsux的每个字母都表示一个匹配方式,可单独或组合使用,只能放在开公式开头。匹配方式请参考第9节。29. 【(?#)】#号后的内容为注释。30. 【(?=)】直接举例,如:a(?=\d),匹配后面为数字的a。注意如果用字串a5来匹配,则a(?=\d)匹配a,而a\d匹配的为a5。31. 【(?!)】如:a(?!\d),匹配后面不为数字的a。32. 【(?<=)】如:(?<=\d)a,匹配前面为数字的a。33. 【(?<!))】如:(?<=\d)a,匹配前面不为数字的a。34. 【(?(number/name)yes|no】:number为分组的编号,name为分组的别名。如果编号或别名指向的分组匹配成功了,则匹配yes公式,否则匹配no公式。如(\d)a((?1)\d|b),可匹配1a5,走的yes公式 或 xab,走的no公式。
9、匹配方式:i = IGNORECASE:忽略大小写;m = MULTILINE:多行模式,改变’^’和’$’的行为;s = DOTALL:点任意匹配模式,改变’.’的行为;L = LOCALE:使预定字符类 \w \W \b \B \s \S 取决于当前区域设定u = UNICODE:使预定字符类 \w \W \b \B \s \S \d \D 取决于unicode定义的字符属性;x = VERBOSE: 详细模式。这个模式下正则表达式可以是多行,忽略空白字符,并可以加入注释。以下两个正则表达式是等价的。
10、上面的6大类34个公式符号,大家都记住了吗。还记得我们前面提到的需求吗?看本文后,回过头来以两个需求为例写出对应的正则表达式吧:1. 找到手机号,公式如下:^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(18[0,5-9]))\\d{8}$2. 找到邮箱地址,公式如下:^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$在复杂的情况下要写出正确的正则表达式是比较困难的。大家要反复练习,才能熟能生巧。