定义:
描述字符串结构模式的形式化表达手法。
用途:
字符串处理,查找、匹配、替换和验证特定字符串。
元字符:
匹配一个位置(3个,^ $ /b)或一个字符串中的字符(7个,. /w /W /s /S /d /D)
匹配位置的元字符:^和/b(匹配单词的开始或结尾,即单词的分界处)
.(点号)匹配除换行符之外的任意字符, /w匹配单词字符(包括字母,数字,下划线,汉字)/W匹配任意非单词字符,/s匹配任意空字符(空格,制表符,换行符,中文全角空格)/S匹配任意非空字符,/d匹配任意的数字字符/D匹配任意的非数字字符
字符 说明
^ 匹配行的开始位置。
$ 匹配行的结束位置。
/b 匹配单词的开始或结束位置。
. 匹配除换行符号之外的任意字符。
/w 匹配单词字符(包括字母、数字、下划线和汉字)。
/W 匹配任意的非单词字符(包括字母、数字、下划线和汉字)。
/s 匹配任意的空白字符,如空格、制表符、换行符、中文全角空格等。
/S 匹配任意的非空白字符。
/d 匹配任意的数字(0-9)。
/D 匹配任意的非数字字符。
^String 匹配以“String”开头的行
String$ 匹配以“String”结尾的行
^String$ 匹配一个只包含字符串“String”的行
^$ 匹配一个空行
/bStr 匹配的字符串必须“Str”开头,且“Str”之前是单词的分界处
ing/b 匹配以“ing”结尾的字符串
/bString/b 匹配一个完整的单词“String”
字符类:
通常情况下,如果要匹配数字、字母、空白等字符时,可以直接使用与这些集合相对应的元字符。如果要匹配的字符集合(如集合[0,1,2,3,4,5])没有与之相对应的元字符时,则需要自定义匹配的字符集合。
正则表达式引入了连接符“-”定义字符的范围
若字符“^”是字符类的第一个字符,则表示否定该字符类,即匹配除了该字符类之外的任意字符
在字符类中使用元字符时,不需要使用转义操作
[aeiou] 匹配字符集合中的任何字符。
[^aeiou] 匹配除字符集合中的之外的字符。
[0-9a-zA-Z_] 匹配任何数字、字母(大写字母和小写字母)和下划线,等同于/w
[^0-9a-zA-Z_] 匹配除任何数字、字母、下划线之外的任何字符,等同于/W。
/p{name} 匹配{name}指定的命名字符类中的任何字符。
/P{name} 匹配除{name}指定的命名字符类中之外的任何字符。
字符转义:
正则表达式定义了一些特殊的元字符,如^、$、.等表达指定的意义,如果需要匹配这些字符本身,则需要使用字符转义来取消这些字符的特殊含义。转义字符为“/”(反斜杠),除了.、$、^、{、[、(、|、)、*、+、?、/之外的字符不需要进行转义,它们都表示字符本身
/. 匹配.
/* 匹配*
// 匹配/
其他常用字符转义
字符或表达式 说明
/a 响铃(警报)/u0007。
/b 在正则表达式中,表示单词的边界;如果在字符类中,则表示退格符/u0008。
/t 制表符符/u0009。
/r 回车符/u000D。
/v 垂直制表符/u000B。
/f 换页符/u000C。
/n 换行符/u000A。
/e 回退(Esc)符/u001B。
/040 将ASCII字符匹配为八进制数(最多三位)。
/x20 使用十六进制表示形式与ASCII字符匹配。
/cC ASCII控制字符,如Ctrl-C。
/u0020 使用十六进制表示形式(恰好四位)与Unicode字符匹配。
反义:
匹配不在特定范围的字符串时需要用到反义,反义表达式有元字符和自定义的用^开头的两种。
常用的反义表达式
字符或表达式 说明
/W 匹配任意的非单词字符(包括字母、数字、下划线和汉字)。
/S 匹配任意的非空白字符。
/D 匹配任意的非数字字符。
/B 匹配不是单词开头和结束的任何位置。
[^a] 匹配除字符a之外的任何字符。
[^aeiou] 匹配除字符集合(aeiou)中的之外的任何字符。
限定符:
正则表达式的元字符一般只能匹配一个字符,如果要匹配0个或1个或多个字符或者未知字符,需要用到限定符。限定符的作用就是制定特定字符或字符集重复出现的次数。
限定符说明表
字符或表达式 说明
{n} 重复n次。
{n,} 重复至少n次。
{n,m} 重复至少n次,最多m次。
* 重复至少0次,等同于{0,}。
+ 重复至少1次,等同于{1,}。
? 重复0次或1次,等同于{0,1}。
*? 尽可能少地使用重复的第一个匹配。
+? 尽可能少地使用重复但至少使用一次。
?? 使用零次重复(如有可能)或一次重复。
{n}? 等同于{n}。
{n,}? 尽可能少地使用重复但至少使用n次。
{n,m}? 介于n次和m次之间、尽可能少地使用重复。
/bname/d+/b 匹配以字符串“name”开头的、以数字字符串结尾的字符串。其中,表达式/d+可以匹配长度至少为1的数字字符串
/d{3} 和正则表达式/d/d/d等价,匹配3位整数
/d{3,} 匹配3位以上(包括3位)的整数
/d{3,4} 式匹配3位或4位的整数
在限定符*、+、?、{n}、{n,}和{n,m}之后再添加一个字符“?”,则表示尽可能少的重复字符“?”之前的限定符号的重复次数,这种方式匹配被称为懒惰匹配
常用的懒惰限定符
字符或表达式 说明
*? 尽可能少地使用重复的第一个匹配。
+? 尽可能少地使用重复但至少使用一次。
?? 使用零次重复(如有可能)或一次重复。
{n}? 等同于{n}。
{n,}? 尽可能少地使用重复但至少使用n次。
{n,m}? 介于n次和m次之间、尽可能少地使用重复。
a.*b 匹配以字母a开头的、以字母b结束的、最长的字符串。此时,这是一种贪婪匹配
a.*?b 匹配以字母a开头的、以字母b结束的、最短的字符串。此时,这是一种懒惰匹配
a.{1,}b 匹配以字母a开头的、以字母b结束的、长度至少为3的字符串
a.{1,}?b 字母a和字母b之间的字符串实际上只重复了1次。如果将正则表达式a.{1,}b应用于字符串“avbab”,则匹配字符串“avbab”。如果将正则表达式a.{1,}?b应用于字符串“avbab”,则匹配字符串“avb”,而不会匹配字符串“avbab”
替换:
最简单的替换使用字符“|”表示,它表示如果某一个字符串匹配了正则表达式中的字符“|”的左边或者右边的规则,那么该字符串也匹配了该正则表达式。首先匹配|字符的左侧部分,当左侧部分不匹配时,它才尝试匹配|字符的右侧部分。
0/d{2}-/d{8}|0/d{3}-/d{7}|0/d{3}-/d{8} 匹配了当前国内部分地区的3种固定电话号码:一种是号码的前4位为区号,后7位为本地号码;另一种是号码的前3位为区号,后8位为本地号码;最后一种是号码的前4位为区号,后8位为本地号码。
Jack|jack 等同于[Jj]ack 或 Jack|jack
分组
反向引用
零宽度断言
负向零宽度断言
匹配选项
注释
优先级顺序
递规匹配