正则表达式
比如说我们要在一个文件中搜索以什么开头、以什么结尾或者包含什么的句子,这时候正则表达式是帮助我们来实现这些功能的东西。
正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。
普通字符
普通字符就是指字母、数字、汉字、下划线、以及没有特殊定义的符号。在正则表达式中,普通字符在匹配的时候只匹配与自身相同的一个字符。
转义字符
一些具有特殊功能的字符,采用在前面加反斜杠进行转义,如. * ?这种有特殊含义直接打出来不能表达为三个字符,我们可以将其打为\. \* \?
元字符
正则表达式中使用了很多元字符,用来表示一些特殊的含义或功能。
表达式 | 匹配 |
---|---|
. | 小数点可以匹配除了换行符\n以外的任意一个字符 比如a.c可以匹配abc |
| | 逻辑或操作符 比如(a |
[] | 匹配字符集中的一个字符 比如[abc]d匹配ad或者bd或者cd |
[^] | 对字符集求反,也就是上面的反操作。尖号必须在方括号里的最前面 比如[^abc]匹配a,b,c之外的任意一个字符 |
- | 定义[]里的一个字符区间,比如[a-g]匹配a到g中任意一个字符 |
\ | 对紧跟其后的一个字符进行转义 |
() | 对表达式进行分组,将圆括号内的内容当做一个整体,并获得匹配的值 |
{n} | 表达式重复n次,比如\d{2}相当于\d\d,a{3}相当于aaa |
{m,n} | 表达式至少重复m次,最多重复n次。比如ab{1,3}可以匹配ab或abb或abbb |
{m,} | 表达式至少重复m次,比如\w\d{2,}可以匹配a12,_1111,M123等等 |
? | 匹配表达式0次或者1次,相当于{0,1},比如a[cd]?可以匹配a,ac,ad |
+ | 表达式至少出现1次,相当于{1,},比如a+b可以匹配ab,aab,aaab等等 |
* | 表达式出现0次到任意次,相当于{0,},比如\^*b可以匹配b,^^b等等 |
^ | 在字符串开始的地方匹配,符号本身不匹配任何字符 |
$ | 在字符串结束的地方匹配,符号本身不匹配任何字符 |
\b | 匹配一个单词边界,也就是单词和空格之间的位置,符号本身不匹配任何字符 |
\B | 匹配非单词边界,即左右两边都是\w范围或者左右两边都不是\w范围时的字符缝隙 |
预定义匹配字符集
表达式 | 匹配 |
---|---|
\d | 任意一个数字,0~9 中的任意一个 |
\w | 任意一个字母或数字或下划线,也就是 A-Z,a-z,0-9,_ 中的任意一个 |
\s | 空格、制表符、换页符等空白字符的其中任意一个 |
\D | \d的反集,也就是非数字的任意一个字符,等同于[^\d] |
\W | \w的反集,也就是[^\w] |
\S | \s的反集,也就是[^\s] |
贪婪与非贪婪模式
在重复匹配时,正则表达式默认总是往多的匹配,这被称为贪婪模式。比如,针对文本axxxaxxxa,表达式(a)(\w+)(a)中的\w+将匹配第一个a和最后一个a之间的所有字符xxxaxxx。可见,\w+在匹配的时候,总是尽可能多的匹配符合它规则的字符。
但是有时候这种模式获得的结果并不是我们想要的,这时在修饰匹配次数的特殊符号后再加上一个?,则可以使匹配次数不定的表达式尽可能少的匹配。
常用正则表达式
功能 | 表达式 |
---|---|
数字 | ^[0-9]*$ |
n位的数字 | ^\d{n}$ |
至少n位的数字 | ^\d{n,}$ |
零和非零开头的数字 | `^(0 [1-9][0-9]*)$` |
有n位小数的正实数 | ^[0-9]+(.[0-9]{n})?$ |
非零的负整数 | ^-[1-9]\d*$ |
非负浮点数 | ^\d+(.\d+)?$ |
浮点数 | ^(-?\d+)(.\d+)?$ |
日期格式 | ^\d{4}-\d{1,2}-\d{1,2} |
Email地址 | ^\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)*$ |
空白行 | \n\s*\r (可以用来删除空白行) |