关于正则表达式
正则表达式,regular expression,简写为 regex。
一组有一些相同特征的字符串可以用正则表达式简洁地表示出来。也就是说,正则表达式是用来简洁地表示一组字符串的表达式。
正则表达式的作用:
- 表达一组字符串的特征。
- 同时查找或替换一组字符串。
- 字符串匹配。
元字符
元字符一览表
元字符 | 描述 |
---|---|
. |
匹配除换行符外的任意单个字符 |
[] |
字符集。匹配方括号内的任意一个字符 |
[^] |
否定字符集。匹配除了方括号里字符外的任意字符 |
{n,m} |
匹配前面的字符 n 到 m 次 |
* |
匹配指定表达式 >=0 次 |
+ |
匹配指定表达式 >= 1次 |
? |
匹配指定表达式 0 次 或 1 次 |
(xyz) |
匹配与 xyz 完全相等的字符串 |
| |
或运算符,匹配符号前或后的字符 |
\\ |
转义字符 |
^ |
检查模式串是否在主串的开头 |
$ |
检查模式串是否在主串的结尾 |
点运算符 .
.
可以匹配除换行符以外的任意字符。
如果用 \
将 .
转义,或将 .
写在 []
内,.
会变成普通字符,只能匹配英文句号。
字符集 []
和否定字符集 [^]
字符集也叫做字符类,方括号用来指定一个字符集。
字符集有两种写法:[aeiou]
、[a-z]
,后一种写法表示从 a 到 z 的任意字符。
在方括号开始处加上 ^
元字符,该字符集会变为否定字符集,如:[^aeiou]
。
重复次数
{n,m}
:匹配前面的字符 n 到 m 次。如果省略 m,表示匹配前面的字符 n 到无穷次,如:{0,}
;如果逗号也省略掉则表示重复固定的次数,如:{3}
表示重复三次。*
号:匹配指定表达式 >=0 次,等价于{0,}
+
号:匹配指定表达式 >=1 次,等价于{1,}
?
号:匹配指定表达式 0 次或 1 次,等价于{0,1}
(...)
特征标群
特征标群是一组写在 ()
中的子模式。
使用特征标群将字符组合起来以后,元字符可以作用在整个特征标群上。如:(abc){5}
会匹配 abc
重复 5 次。
或运算符 |
与其他元字符不同的是,其他元字符往往以一个字符为单位,而或运算符以一个字符串为单位,直到字符串结束或遇到 ()
。
如:abcd|efgh
匹配 abcd
或 efgh
。
我们经常使用 ()
来限制或运算符的作用范围,如:(a|b)cd
匹配 acd
或 bcd
。
转义符号 \
使用 \
可以将元字符转义为普通字符,或将某些普通字符转义为简写字符集。
锚点
在正则表达式中,想要匹配指定开头或结尾的字符串就要使用到锚点。^
指定开头,$
指定结尾。
例如 ^(T|t)he
只能匹配字符串开头的 The 或 the,(T|t)he$
只能匹配字符串结尾的 The 或 the。
简写字符集
正则表达式提供了一些常用的字符集简写,如下:
简写 | 描述 |
---|---|
. |
匹配除换行符外的所有字符 |
\\d |
匹配数字。等同于 [0-9] |
\\D |
匹配非数字。等同于 [^\\d] |
\\w |
匹配所有字母数字。等同于 [a-zA-Z0-9_] |
\\W |
匹配所有非字母数字,即符号。等同于 [^\\w] |
\\s |
匹配所有空白字符。等同于 [\\t\\n\\f\\r\\p{Z}] |
\\S |
匹配所有非空白字符。等同于 [^\\s] |
\\n |
匹配一个换行符 |
\\r |
匹配一个回车符 |
\\p |
匹配 CRLF(等同于 \\r\\n ),即 windows 下的行终止符 |
\\t |
匹配一个制表符 |
\\v |
匹配一个垂直制表符 |
\\f |
匹配一个换页符 |
零宽度断言(前后预查)
断言的作用与种类
先行断言用于判断所匹配的格式是否在另一个确定的格式之前,匹配结果不包含该确定格式;相对的,后发断言用于判断所匹配的格式是否在另一个确定的格式之后。
例如,如果想要获得所有跟在 $
符号后的数字,可以使用正后发断言 (?<=\$)[0-9\.]*
。这个表达式匹配 $
开头,之后跟着 0,1,2,3,4,5,6,7,8,9,.
,这些字符可以出现大于等于 0 次。
零宽度断言有如下几种:
符号 | 描述 |
---|---|
?= |
正先行断言 - 存在 |
?! |
负先行断言 - 排除 |
?<= |
正后发断言 - 存在 |
?<! |
负后发断言 - 排除 |
正先行断言
?=...
正先行断言,表示第一部分表达式之后必须跟着 ?=...
定义的表达式。
返回结果只包含满足匹配条件的第一部分表达式。定义一个正先行断言要使用 ()
。在括号内部使用一个问号和等号:(?=...)
正先行断言的内容写在括号中的等号后面。例如,表达式 (T|t)he(?=\sfat)
匹配 The
和 the
,在括号中又定义了正先行断言 (?=\sfat)
,即 The
和 the
后面紧跟着 (空格)fat
(T|t)he(?=\sfat)
—> The fat cat sat on the mat.
负先行断言
负先行断言 ?!
用于筛选所有匹配结果,筛选条件为 其后不跟随着断言中定义的格式。负先行断言定义和正先行断言一样,区别就是 =
替换成 !
也就是 (?!...)
表达式 (T|t)he(?!\sfat)
匹配 The
和 the
,且其后不跟着 (空格)fat
:
(T|t)he(?!\sfat)
—> The fat cat sat on the mat.
正后发断言
正后发断言记作(?<=...)
,用于筛选所有匹配结果,筛选条件为其前跟随着断言中定义的格式。例如,表达式 (?<=(T|t)he\s)(fat|mat)
匹配 fat
和 mat
,且其前跟着 The
或 the
(?<=(T|t)he\s)(fat|mat)
—> The fat cat sat on the mat.
负后发断言
负后发断言记作 (?<!...)
,用于筛选所有匹配结果,筛选条件为其前不跟随着断言中定义的格式。例如,表达式 (?<!(T|t)he\s)(cat)
匹配 cat
,且其前不跟着 The
或 the
(?<!(T|t)he\s)(cat)
—> The cat sat on cat.
贪婪匹配与惰性匹配
正则表达式默认采用贪婪匹配模式,在该模式下意味着会匹配尽可能长的子串,而惰性匹配则是匹配尽可能短的子串。
如对于字符串 <div>some words</div>
来说,<.*>
会匹配整个字符串,因为默认贪婪匹配。
在表示重复次数的元字符后面加上一个 ?
会启用惰性匹配模式,如:
?
—>??
*
—>*?
+
—>+?
{1,}
—>{1,}?
所以,对于上面的字符串,<.*?>
的匹配结果是 <div>
。
标志
常用正则表达式
表达式 | 作用 |
---|---|
^[A-Za-z]+$ |
开头和结尾字符完全匹配,中间为任意个英文字母 |
^[A-Za-z0-9]+$ |
开头和结尾字符完全匹配,中间为任意个英文字母或数字 |
^-?\\d+$ |
开头和结尾字符完全匹配,表示一个整数 |
^[0-9]*[1-9][0-9]*$ |
开头和结尾字符完全匹配,表示一个正整数 |
[1-9]\\d{5} |
中国境内的邮政编码 |
[\\u4e00-\\u9fa5] |
匹配中文字符(UTF-8 编码) |
\\d{3}-\\d{8}|\\d{4}-\\d{7} |
国内电话号码,如:010-68913536 |
(([1-9]?\\d|1\\d{2}|2[0-4]\\d|25[0-5])\\.){3}([1-9]?\\d|1\\d{2}|2[0-4]\\d|25[0-5]) |
匹配 ip 地址 |
正则表达式合集:
一组匹配中国大陆手机号码的正则表达式: