正则表达式是上个学期老师花一节课讲的内容,比较有用且难以记住,因此复习一下正则表达式的内容。
为什么要学习正则表达式?它是用于进行文本匹配的工具,能够方便地抓取到你所需要的内容,解析一段内容所包含的信息。
1.入门
1.1首先列举一些正则表达式的例子:\d+(匹配一个或更多的数字,+代表一个或多个。)
hi(直接匹配hi这个字符串,不管它是单独的还是在其他单词中包含) \bhi\b(\b意为单词的开头或结尾,不匹配单词之间的空格,仅仅是一个位置)
(.代表匹配任意的字符,*代表0个或多个,.*意为匹配任意数量的任意字符)
0\d\d-\d\d\d\d\d\d\d\d(代表三位区号加-后8位数字的电话号码,三位或四位区号的:0\d\d\d?-\d\d\d\d\d\d\d\d,这里?代表0个或一个)
\d{2}(\d必须出现2次) \d{1,2}(\d最少出现一次,最多出现2次)
[1-9](匹配一个数字,相当于\d)
1.2测试正则表达式:
1.3特殊代码:像. \d {}等
1.4非打印字符
字符 | 含义 |
\cx | 匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。 |
\f | 匹配一个换页符。等价于 \x0c 和 \cL。 |
\n | 匹配一个换行符。等价于 \x0a 和 \cJ。 |
\r | 匹配一个回车符。等价于 \x0d 和 \cM。 |
\s | 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。 |
\S | 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。 |
\t | 匹配一个制表符。等价于 \x09 和 \cI。 |
\v | 匹配一个垂直制表符。等价于 \x0b 和 \cK。 |
1.5限定符
字符 | 描述 |
* | 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。 |
+ | 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。 |
? | 匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。 |
{n} | n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。 |
{n,} | n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。 |
{n,m} | m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。 |
不能对\b使用限定符。
1.6字符转义:查找特殊代码本身时,需要在代码前再加个\,比如查找( 应该使用\(查找。
1.7三种括号的作用
由于正则表达式语法复杂,因此我自己总结了小括号,中括号,大括号分别的用法,便于理解。
小括号:1.分组:使用小括号指定一个子表达式,每个括号中的子表达式默认为分组1,2,3,……比如我想要匹配重复的单词:\b\w+\b\s+\1\b 这里\b\w+\b意为一个大于等于1的单词或数字,\s+\1\b意为若干个空白符加上前面第一组子表达式。定义组名:(?<Word>\w+)给\w+取名Word。圆括号会有一个副作用,是相关的匹配会被缓存,此时可用?:放在第一个选项前来消除这种副作用。即(?:\w+)|(\d+)此时前一个选项匹配到的结果不会被缓存。
2.位置指定:(?=exp)也叫零宽先行断言,它匹配文本中的某些位置,这些位置的后面能匹配给定的后缀exp。比如\b\w+(?=ing\b),匹配以ing结尾的单词的前面部分(除了ing以外的部分),如果在查找I'm singing while you're dancing.时,它会匹配sing和danc。
零宽后行断言,它匹配文本中的某些位置,这些位置的前面能给定的前缀匹配exp。比如(?<=\bre)\w+\b会匹配以re开头的单词的后半部分(除了re以外的部分),例如在查找reading a book时,它匹配ading。
(?!exp),只会匹配后缀exp不存在的位置。\d{3}(?!\d)匹配三位数字,而且这三位数字的后面不能是数字。
(?<!exp),零宽负向后行断言来查找前缀exp不存在的位置:(?<![a-z])\d{7}匹配前面不是小写字母的七位数字(实验时发现错误?注意你的“区分大小写”先项是否选中)。
3.注释功能:小括号的另一种用途是能过语法(?#comment)来包含注释。
中括号:中括号中包含的一般是字符,特殊符号在中括号中都失去作用。[aeiou]匹配任何一个元音字母,[*+?]匹配*或+或?。[1-9]匹配任意一个数字。[1-9]{2}匹配两个数字。
大括号:{n}重复n次,{n,}重复n次或更多次,{n,m}重复n次到m次。
1.8贪婪与懒惰:如:a.*b会匹配a开头b结尾的字符串,长度尽可能长。a.*?b则匹配尽可能少的字符。若有字符aabab,贪婪匹配将匹配aabab,懒惰匹配将匹配aab,ab。
1.9反义:
表3.常用的反义代码
代码/语法 | 说明 |
\W | 匹配任意不是字母和数字的字符 |
\S | 匹配任意不是空白符的字符 |
\D | 匹配任意非数字的字符 |
\B | 匹配不是单词开头或结束的位置 |
[^x] | 匹配除了x以外的任意字符 |
[^aeiou] | 匹配除了aeiou这几个字母以外的任意字符 |