[复习]正则表达式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[复习]正则表达式相关的知识,希望对你有一定的参考价值。
正则表达式是上个学期老师花一节课讲的内容,比较有用且难以记住,因此复习一下正则表达式的内容。
为什么要学习正则表达式?它是用于进行文本匹配的工具,能够方便地抓取到你所需要的内容,解析一段内容所包含的信息。
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测试正则表达式:http://tool.oschina.net/regex#
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)也叫零宽后行断言,它匹配文本中的某些位置,这些位置的前面能给定的前缀匹配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反义:
代码/语法 | 说明 |
---|---|
\W | 匹配任意不是字母和数字的字符 |
\S | 匹配任意不是空白符的字符 |
\D | 匹配任意非数字的字符 |
\B | 匹配不是单词开头或结束的位置 |
[^x] | 匹配除了x以外的任意字符 |
[^aeiou] | 匹配除了aeiou这几个字母以外的任意字符 |
2.应用
(1)测试字符串的某个模式。例如,可以输入一个字符串进行测试看该字符串中是否存在一个电话号码模式或者一个信用卡模式,这成为数据的有效性检验。
(2)替换文本。可以再文档中使用一个正则表达式来表示特定文字,然后可以将其全部删除或者替换成别的文字。
(3)根据模式匹配从字符串中提取一个子字符串。可以用来在文本或者输入字段中查找特定的文字。
一个正则表达式就是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
以上是关于[复习]正则表达式的主要内容,如果未能解决你的问题,请参考以下文章