正则表达式学习记录
一,字符匹配
1。 \b 代表着单词的开头或结尾,也就是单词的分界处。虽然通常英文的单词是由空格,标点符号或者换行来分隔的,但是\b并不匹配这些单词分隔字符中的任何一个,它只匹配一个位置。
2。 . 是另一个元字符,匹配除了换行符以外的任意字符。
3。 \n 换行符
4。 \d 匹配一个数字 【0,1,2,3.....】
5。 \w 匹配字母或数字或下划线或汉字等
6。 \s 匹配任意的空白符,包括空格,制表符(Tab),换行符,中文全角空格等
7。 ^ 匹配字符串的开始
8。 $ 匹配字符串的结束
9。 \ 取消字符的特殊意义,当然如何查找\ 也要用\,那么就是\\
10。 [] 匹配其中的任何一个字符,可以是范围,也可以是指定的特定的字符
如果是范围使用“-”符号,否则直接指定即可
11。 | 相当于编码中的or 前后只要有一个满足条件,即可匹配成功。
12。 () 将括号中的所有正则表达式作为一个整体
二,重复匹配数量
1。 * 同样是元字符,不过它代表的不是字符,也不是位置,而是数量——它指定*前边的内容可以连续重复使用任意次。
2。 {一个整数} 表示大括号前面的重复出现的次数
{一个小整数,一个大整数} 重复匹配的次数,最少不能少于,最大不能大于
例子:0\d{2}-\d{8} 以0开头,后面跟两位数字,以"-"符号连接,后面跟8个数字
3。 + 这里的+是和*类似的元字符,不同的是*匹配重复匹配任意次(可能是0次),而+则重复匹配1次或更多次
4。 ? 重复零次或一次,也就是可有可无
*
|
匹配前面的子表达式任意次。例如,zo*能匹配“z”,“zo”以及“zoo”,但是不匹配“bo”。*等价于{0,}。
|
+
|
匹配前面的子表达式一次或多次(大于等于1次)。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}。
|
?
|
匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“do”或“does”中的“do”。?等价于{0,1}。
|
三反义,及其他
. 常用的反义
表3.常用的反义代码 代码/语法 说明
\W 匹配任意不是字母,数字,下划线,汉字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非数字的字符
\B 匹配不是单词开头或结束的位置
[^x] 匹配除了x以外的任意字符
[^aeiou] 匹配除了aeiou这几个字母以外的任意字符
18 (?=exp) 也叫零宽度正预测先行断言
(?<=exp) 也叫零宽度正回顾后发断言
贪婪与懒惰
当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。以这个表达式为例:a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配。
有时,我们更需要懒惰匹配,也就是匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?。这样.*?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。现在看看懒惰版的例子吧:
a.*?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab(第一到第三个字符)和ab(第四到第五个字符)。
为什么第一个匹配是aab(第一到第三个字符)而不是ab(第二到第三个字符)?简单地说,因为正则表达式有另一条规则,比懒惰/贪婪规则的优先级更高:最先开始的匹配拥有最高的优先权——The match that begins earliest wins。
代码/语法 | 说明 |
---|---|
*? | 重复任意次,但尽可能少重复 |
+? | 重复1次或更多次,但尽可能少重复 |
?? | 重复0次或1次,但尽可能少重复 |
{n,m}? | 重复n到m次,但尽可能少重复 |
{n,}? | 重复n次以上,但尽可能少重复 |