正则表达式中,所有字符分为两类:
普通字符和元字符
主要普通字符:小写字母、大写字母、数字、下划线、部分特殊符号、非西文字符等
主要元字符(具有特殊含义的字符):. \ { } * + ? ( ) [ ] - | ^ $
. 表示任意一个字符(除了换行符)
\ 转移符,用来改变其他字符的含义,如:
\ 元字符把元字符转义为普通字符,如\.把元字符.转义为普通字符的.
\ 普通字符把普通字符转义为含有特殊含义的字符,如:
\n 换行符 \r 回车符 \t 制表符. . .
重复匹配
(x表示一个字符,或者一个字符类,或者一个组等)
x{n} x连续出现n次
x{n,} x至少连续出现n次
x{n,m} x至少连续出现n次,至多连续出现m次
x* x连续出现0次或多次,等同于x{0,}
x+ x至少连续出现1次,等同于x{1,}
x? x出现0次或1次,等同于x{0,1}
选择匹配
使用 | 实现选择匹配,即多个选项中任选一个
a|b|c 匹配a或者b或者c
red|blue|green 匹配red或者blue或者green
字符类
匹配候选字符的任意一个
[] [abc] 匹配abc中任意一个字符,类似a|b|c
[^ ] [^abc] 匹配非abc的任意一个字符
[ - ] [0-9]、[a-z]、[a-zA-Z] 匹配范围内的任意一个字符
注意:字符类中的元字符(\除外),会被自动转义为普通字符,比如[.]等同于[\.]
\w 代表一个单词字符,类似于[a-zA-Z0-9_],有的语言中也可以匹配中文
\W 代表一个非单词字符,类似于[^a-zA-Z0-9_]
\d 代表一个数字字符,等同于[0-9]
\D 代表一个非数字字符,等同于[^0-9]
\s 代表一个空白字符
\S 代表一个非空白字符
位置匹配
正则中的匹配有两种,一种是匹配具体的字符,另一种是匹配特定的位置
^ 匹配文本开始位置
$ 匹配文本结束位置
\b 匹配单词边界(单词开始位置或结束位置)
校验操作时,是否使用^和$对校验操作没有影响
获取、替换等操作时,一般不使用^和$
组 group
正则使用 ( ) 表示一个组,组可以让若干字符形成一个小整体
(ab) 匹配ab
(red|blue|green) 匹配red或者blue或者green
(red|blue|green) color匹配red color或者blue color或者green
color在匹配时,组的当前"取值" 会被临时保存起来,方便引用。可以使用 \1 引用第一个组的当前"取值",最多可以引用九个不同的组:\9
(ab)c\1 匹配abcab
([ab])\1 匹配aa或者bb
(a)(b)\1\2 匹配abab
标记 flag
标记用来额外指定正则的匹配策略(标记可以不写在正则表达式内)
i 大小写不敏感insensitive(也可以理解成ignore)
g 全局匹配global效果是可以依次的获取到和正则匹配的所有子字符串
m 多行匹配multiline效果是^和$可以匹配一段文本中每行的开始和结束位置
常用正则表达式
校验数字:^[0-9]*$
校验整数或者小数:^[0-9]+([.][0-9]+){0,1}$
校验qq号:[1-9][0-9]{4,}
校验手机号:^1[34578]\d{9}$
校验身份证:(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|x|X)$)
校验日期(格式:yyyy-mm-dd,已考虑平闰年):^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$
校验email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
校验URL:^[a-zA-z]+://[^\s]*$