(本文大部分内容来源于此链接的文章,我对部分内容做了一些改动,方便自己日后复习,若有侵权,请联系我,我会将此文删除,谢谢)
正则表达式,是一组由字母和符号组成的特殊文本,可用来从文本中找出我们需要的部分。
正则表达式是一种从左向右匹配主体字符串的模式,术语为"regex"或"regexp"。
正则表达式可以从一个基础字符串中根据特定的匹配模式替换文本中的字符串、提取字符串等。
这是一个正则表达式:^[a-z0-9_-]{3.15}$
。解释:^
为开始标记;[a-z0-9_-]
表示字母(a-z)数字(0-9)下划线_连字符-;{3, 15}
表示3~15个字符的长度;$
表示结束标记。这个正则表达式可以接受naruto_sasuke
,na-ruto_sasuke
,naruto23_sasuke
;但是不接受OP
,以为它包含的是大写字母,而且字符长度小于3。
文章目录
1 基本匹配
正则表达式是在执行搜索时的格式,由字母数字组合成正则表达式。
如,正则表达式the
,只能匹配the
。
而,正则表达式123
匹配123
。它逐个字符的与输入的正则表达式做比较。
正则表达式是大小写敏感的,所以the
不会匹配The
2 元字符
正则表达式主要依赖于元字符。元字符都有特殊的含义。部分元字符放在方括号中的时候会有特殊的含义。下面是一部分元字符的介绍:
元字符 | 描述 |
---|---|
. | 句号匹配任意单个字符,不能匹配换行符 |
[] | 字符种类。匹配方括号内的任意字符 |
[^] | 否定的字符种类。匹配除了括号里的任意字符 |
* | 匹配*号前面的字符零次或者多次,如zo*可以匹配z,也可以匹配zo,zoo… |
+ | 匹配+号前面的字符一次或者多次,如zo+可以匹配zo,也可以匹配zoo,zooo…但是不能匹配z |
? | 标记?之前的字符为可选 |
{n,m} | 匹配num个大括号之间的字符(n <= num <= m) |
(xyz) | 字符集,匹配与xyz完全相等的字符串 |
| | 或运算符,匹配|前或后的字符 |
\ | 转义字符,用于匹配一些保留的字符[ ] ( ) { } . * + ? ^ $ \ | |
^ | 从开始行开始匹配 |
$ | 从末端开始匹配 |
2.1 点运算符.
.
匹配任意单个字符,但是不匹配换行符。如,正则表达式.ar
匹配一个任意字符后面是ar
的字符串。
如,".ar"可以匹配:
The car parked in the garage.
的,car,par,gar
2.2 字符集
方括号用来指定一个字符集。在方括号中使用连字符来指定字符集的范围。方括号中的字符集不关心顺序。如,正则表达式[Tt]he
匹配the
和The
。
方括号里的句号就只表示句号。如,正则表达式ar[.]
匹配ar.
这个字符串。
ar[.]
匹配:
I have a car.
的ar.
2.2.1 否定字符集
一般,^
表示字符串的开头。但是当用在一个方括号的开头时,表示这个字符集是否定的。如[^c]ar
匹配的是,某ar
的字符串,其中’某’是除了c
的任意字符,即不匹配car
,但是可以匹配par
、gar
等字符串。
[^c]ar
可以匹配:
The car parked in the garage.
的par,gar
2.3 重复次数
元字符+
,*
,?
,用于指定匹配子模式的次数。
2.3.1 *
号
*
号匹配在*
之前的字符出现大于等于0次。
如,正则表达式a*
匹配0个或1个或更多个以a开头的字符。
正则表达式[a-z]*
匹配一个行中所有以小写字母开头的字符串。
如[a-z]*
匹配:
The car parked in the garage.
的he car parked in the garage
用.*
可以匹配所有的字符。
*
和表示匹配空格的\s
连起来使用的话,如正则表达式\s*cat\s*
匹配,0或更多个空格开头和0或更多个空格结尾的cat字符串。
如:\s*cat\s*
匹配
The fat cat sat on the concatenation.
的cat
(注意,cat左右各有一个空格)和cat
2.3.2 +
号
+
号匹配+
号之前的字符出现大于等于1次。
如,正则表达式c.+t
匹配以首字母c
开头以t
结尾,中间跟着至少一个字符的的字符串。
正则表达式c.+t
匹配:
The fat cat sat on the mat.
的cat sat on the mat
(注意,匹配的字符串不仅包括这5个单词,还有中间的4个空格)
2.3.3 ?
号
元字符?
标记在?
之前的字符为可选,即出现0次或1次。
如,正则表达式[T]?he
匹配
The car parked in the garage.
的The,he
2.4 {}
号
{}
是一个量词,用来表示一个字符或一组字符可以重复出现的次数。
如,正则表达式[0-9]{2,3}
匹配
The number was 9.9997 but we rounded it off to 10.0.
的999,10
{}
的第二个参数可以省略。如,[0-9]{2,}
匹配至少两位0~9的数字
若逗号也省略,则表示重复固定次数。如,[0-9]{3}
匹配3位数字。
2.5 (...)
特征标群
特征标群是一组写在(...)
中的子模式。
如之前已讨论过的{}
是表示{}
前面一个字符出现指定次数。而若在{}
前加入特征标群则表示整个标群内的字符重复N次。
如,正则表达式(ab)*
匹配连续出现0个或更多个ab
。
可以在()
中用|
表示或。如正则表达式(c|g|p)ar
匹配
The car is parked in the garage.
的car,par,gar
2.6 |
或运算符
或运算符表示的是"或"。
如,(T|t)he|car
匹配(T|t)he
或car,
(T|t)he|car
匹配
The car parked in the garage.
的The,car,the
2.7 转码特殊字符
反斜线\
用于转码紧跟其后的字符。用于指定{ } [ ] / \ + * . $ ^ | ?
这些特殊字符。若要匹配这些字符,则需要在其前面加上反斜线\
。
如,.
是用来匹配除换行符外的所有字符的。而若想匹配句中的.
,则要写成\.
。下例中,\.?
表示选择性匹配.
如,正则表达式(f|c|m)at\.?
匹配
The fat cat sat on the mat.
的fat,cat,mat.(mat后面有.号)
2.8 锚点
想要匹配指定开头或结尾的字符串就要使用到锚点。
^
指定开头,$
指定结尾。
2.8.1 ^
号
^
检查匹配的字符串是否在被匹配字符串的开头。
如,用正则表达式^a
匹配abc
会得到a
。而用^b
匹配时,匹配不到任何字符,因为字符串abc
并不是以b
开头的。
如,^(T|h)he
匹配
The car parked in the garage.
的The(是开头的这个,The)
2.8.2 $
号
$
匹配字符是否为最后一个。
如(at\.)$
匹配
The fat cat. sat. on the mat.
的at.
(是结尾的at,包括.)
3 简写字符集
如下为一些常用的字符集简写:
简写 | 描述 |
---|---|
. | 除换行符外的所有字符 |
\w | 匹配所有字母数字下划线,等同于[a-zA-Z0-9_] |
\W | 匹配所有非字母数字下划线,等同于[^\w] |
\d | 匹配数字[0-9] |
\D | 匹配非数字[^\d] |
\s | 匹配所有空格字符,等同于[\t\n\f\r] ,\f 是换页符,\r 是回车 |
\S | 匹配所有非空格字符,即[^\s] |
\f | 匹配一个换页符 |
\n | 匹配一个换行符 |
\r | 匹配一个回车符 |
\t | 匹配一个制表符 |
\v | 匹配一个垂直制表符 |
\p | 匹配CR/LF(等同于\r\n ),用来匹配DOS行终止符 |
4 零宽度断言(前后预查)
先行断言和后发断言均属于非捕获簇(不捕获文本,也不针对组合进行计数)。先行断言用于判断所匹配的格式是否在另一个确定的格式之前,匹配的结果不包含该确定格式(仅作为约束)。
符号 | 描述 |
---|---|
?= | 正先行断言-存在 |
?! | 负先行断言-排除 |
?<= | 正后发断言-存在 |
?<! | 负后发断言-排除 |
我们可能看到这里后,有很多疑惑。别头疼,先看看下面四个解释小节吧!
4.1 ?=...
正先行断言
?=...
,表示第一部分表达式之后必须跟着?=...
定义的表达式。
返回的结果只包含满足匹配条件的第一部分表达式。定义一个正先行断言需要使用括号()
,格式为(?=...)
。正先行断言的内容写在括号中的等号=
后面。
如,正则表达式(T|t)he(?=\sfat)
匹配The和the,正先行断言(?=\sfat)
表示所匹配的The或the后面必须紧跟(空格)fat
,即必须是the fat
或The fat
才能返回the或者The
如,正则表达式(T|t)he(?=\sfat)
匹配
The fat cat sat on the mat.
的The(不能匹配the,解释如上一段所讲)
4.2 ?!...
负先行断言
负先行断言?!
用于筛选匹配结果,筛选条件是 其后无断言中所定义的格式。
定义一个负先行断言需要使用括号()
,格式为(?!...)
。
如,正则表达式(T|t)he(?!\sfat)
匹配The
和the
,且后面不允许跟(空格)fat
如,正则表达式(T|t)he(?!\sfat)
匹配
The fat cat sat on the mat.
的the(不能匹配The,解释如上一段所讲)
4.3 ?<=...
正后发断言
正后发断言记作(?<=...)
,用于筛选匹配结果,筛选条件为 匹配结果前必须跟着断言中定义的格式。
如,正则表达式(?<=(T|t)he\s)(fat|mat)
匹配fat
和mat
,且前面必须跟着The(空格)
或the(空格)
如,正则表达式(?<=(T|t)he\s)(fat|mat)
匹配
The fat cat sat on the mat.
的fat和mat,因为这两个单词的前面有The或the。
4.4 ?<!...
负后发断言
负后发断言记作(?<!...)
用于筛选所有匹配结果,筛选条件为 匹配的结果前不跟着断言中定义的格式。
如,正则表达式(?<!(T|t)he\s)(cat)
匹配的是cat
,且前面不允许跟着The
或the
。
如,正则表达式(?<!(T|t)he\s)(cat)
匹配
The cat sat on cat.
的cat
(只匹配第二个cat,因为第一个cat前有The)
5 标志
标志也叫模式修正符,可以用来修改表达式的搜索结果。这些标志可以组合使用,也是整个正则表达式的一部分。
标志 | 描述 |
---|---|
i | 忽略大小写 |
g | 全局搜索 |
m | 多行修饰符 |
5.1 忽略大小写
i
用于忽略大小写。
如,正则表达式/The/gi
表示在全局搜索The
,在后面的i
将其条件修改为忽略大小写,变成搜索the
的任意大小写,如the、The、tHe、thE等。g
表示全局搜索。
如,正则表达式/The/gi
匹配
The fat cat sat on the mat.
的The和the。
5.2 全局搜索
g
用于执行一个全局搜索匹配,即,不仅仅返回匹配的第一个结果,而是返回全部的匹配结果。
如,正则表达式/.(at)/g
表示搜索 任意字符(除去换行)+ at
,并且返回全部结果。
如,正则表达式/.(at)/g
匹配
The fat cat sat on the mat
的fat,cat,sat,mat
5.3 多行修饰符
多行修饰符m
用于执行一个多行匹配。
之前介绍的^
与$
用于检查格式是否在待检测字符串的开头或结尾。而若想在每行的开头和结尾奏效,则需要多行修饰符m
。
如,正则表达式/at(.)?$/gm
表示小写字符a后跟小写字符t,末尾可选除换行符外的任意字符。m
修饰符表示匹配每行的结尾。
如,/.at(.)?$/gm
匹配
The fat
cat sat
on the mat.
的fat,sat,mat
6 贪婪匹配与惰性匹配
正则表达式默认采用贪婪匹配模式,即会匹配尽可能长的子串。可以使用?
号将贪婪匹配模式转换为惰性匹配模式。
如,正则表达式.*at
匹配
The fat cat sat on the mat.
的The fat cat sat on the mat,默认匹配尽可能长的子串,即贪婪匹配
如,正则表达式.*?at
匹配
The fat cat sat on the mat.
的The fat
(本文大部分内容来源于此链接的文章,我对部分内容做了一些改动,方便自己日后复习,若有侵权,请联系我,我会将此文删除,谢谢)