正则表达式入门学习
参考文章
写在前面:正则表达式主要分为三大宏观规则和两大微观规则,通过进一步学习正则表达式,加深对于正则的理解,以便后面的学习
三大宏观规则
一、交集规则
如果你有两个正则表达式E和F,那么EF也是一个正则,表示同时匹配E和F的内容
二、并集规则
1、如果你有两个正则表达式E
和F
,那么E|F
也是一个正则,表示匹配E
或者匹配F
。
2、如果连接非常多的正则,那就得写非常多竖线,看起来也非常乱。所以还有一种简化记法[EFGH]
。也就是[EFGH]
跟写成E|F|G|H
是等价的
三、补集规则
[EF]
可以匹配那些匹配E
或者匹配F的内空,在前加上一个^表示取反的意思,原来的逻辑或关系变成了逻辑与。所以[^EF]
匹配那些不能匹配E
而且不能匹配F
的内容
两大微观规则
一、单字符规则
匹配的字符个数只有一个,根据字符的种类不同而规则不同
1、正则提供的连字符,可以使用减号-表示连续出现的字符,只需写出头尾,可以把[0123456789]
进一步简化成[0-9]
,把[abc...xyz]
简化成[a-z]
2、将一些常用的记法简化
因为[0-9]
很常用,大家又进一步简化成了\d
(对应单词 digit)
因为[a-zA-Z]
也很常用,大家就把它简化成\a
(对应单词 alpha)
如果想匹配大小写字母、数字和下划线(也就是所有单词字符),可以写成[a-zA-Z0-9_]
。也是因为太常用,大家将其简化为\w
(对应单词 word)
如果想匹配一些不可见的字符,可以写成[ \t\r\n\v\f]
,这个正则会匹配空格、水平制表符、回车、换行、 垂直制表符和 Page break 记,可以被简化为\s
对应的不匹配这些字符换成大写字母即可
二、多字符规则
用大括号{}来实现
1、匹配m到n次 {m, n}
2、匹配至少出现一次, 即 {1,}简化成 +号
3、匹配成多次或者不出现, 即{0, }简化成 * 号
4、匹配出现零次或者一次,即{0, 1}简化成 ?号
拓展内容
贪心与非贪心
正则表达式默认使用贪心模式,一次性匹配尽可能长的内容,通过添加?在*后面将模式设为非贪心模式
引用
正则引擎会为每个括号分配一个编号(从1开始记数),并记录括号的内容,大家可以使用\+数字
的方式来引用。
通过例子说明:给定一段 html <h1>this is a title</h1><h1>this is content</h2>
。这里第二个<h1>
没有闭合,结束标签写成了h2
。如果只想匹配正常结束的h1
,那可以写成<(h1)>.*</\1>
环视
这个内容很抽象,需要好好领会,直接复制过来,用做记录
比如我们有字符串foobarbarfoo
。下面我将用大写字母表示想要匹配的内容。为了跟英语原文对应,我们规定当前字符右边为前(未处理),左边为后(已处理)。
如果只想匹配第一个出现的bar
,也就是fooBARbarfoo
。肯定不能只写成bar
,因为第二个bar
也会匹配到。我们希望正则引擎在每碰到一个bar
的时候继续向前(右)看看还有没有bar
,如果还有则说明不是第一个。所以,需要写成bar(?=bar)。 括号里以?开头,=表示检查是否出现, 因为是继续向前(右)看,所以叫做前向肯定环视(Look ahead positive)。
如果想匹配第二个bar
也就是foobarBARfoo
,则需要写成bar(?!bar)
。也就是说查到bar
只后还要继续向前(右)看,没有bar
才算匹配到。因为是没有,所以叫前向否定环视(Look ahead negative)。
第一个,可以匹配单词的边界。这个两个合起来 (?<=\W)(?=\w)|(?<=\w)(?=\W),就可以匹配单词的左右边界,可以简化成\b
第二个,可以匹配一行的开始和结束。一行的开始,顾名思义,就是第一个字符之前的位置,在它之前没有字符,在它之后是任意字符,即(?<!.)(?=.)