正则表达式笔记
元字符
元字符 | 描述 |
---|---|
. | 匹配除换行符以外的任意字符。 |
[ ] | 字符类,匹配方括号中包含的任意字符。 |
[^ ] | 否定字符类。匹配方括号中不包含的任意字符 |
* | 匹配前面的子表达式零次或多次 |
+ | 匹配前面的子表达式一次或多次 |
? | 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。 |
花括号,匹配前面字符至少 n 次,但是不超过 m 次。 | |
(xyz) | 字符组,按照确切的顺序匹配字符xyz。 |
| | 分支结构,匹配符号之前的字符或后面的字符。 |
\ | 转义符,它可以还原元字符原来的含义,允许你匹配保留字符 [ ] ( ) { } . * + ? ^ $ \ | |
^ | 匹配行的开始 |
$ | 匹配行的结束 |
简写字符集
简写 | 描述 |
---|---|
. | 匹配除换行符以外的任意字符 |
\w | 匹配所有字母和数字的字符: [a-zA-Z0-9_] |
\W | 匹配非字母和数字的字符: [^\w] |
\d | 匹配数字: [0-9] |
\D | 匹配非数字: [^\d] |
\s | 匹配空格符: [\t\n\f\r\p{Z}] |
\S | 匹配非空格符: [^\s] |
断言
后行断言和先行断言有时候被称为断言,它们是特殊类型的 非捕获组 (用于匹配模式,但不包括在匹配列表中)。当我们在一种特定模式之前或者之后有这种模式时,会优先使用断言。
例如我们想获取输入字符串 $4.44 and $10.88
中 $
字符之前的所有数字。我们可以使用这个正则表达式 (?<=\$)[0-9\.]*
,表示: 获取 $
字符之前的所有的数字包含 .
字符。
以下是正则表达式中使用的断言:
符号 | 描述 |
---|---|
?= | 正向先行断言 |
?! | 负向先行断言 |
?<= | 正向后行断言 |
?<! | 负向后行断言 |
正向先行断言
正向先行断言认为第一部分的表达式必须是先行断言表达式。返回的匹配结果仅包含与第一部分表达式匹配的文本。
要在一个括号内定义一个正向先行断言,在括号中问号和等号是这样使用的 (?=...)
。先行断言表达式写在括号中的等号后面。
例如正则表达式 (T|t)he(?=\sfat)
,表示: 匹配大写字母 T
或小写字母 t
,后面跟字母 h
,后跟字母 e
。
在括号中,我们定义了正向先行断言,它会引导正则表达式引擎匹配 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)
,表示: 从输入字符串中获取在单词 The
或 the
之后的所有 fat
和 mat
单词。
"(?<=(T|t)he\s)(fat|mat)" => The fat cat sat on the mat.
负向后行断言
负向后行断言是用于获取不在特定模式之前的所有匹配的内容。负向后行断言表示为 (?<!...)
。例如正则表达式 (?<!(T|t)he\s)(cat)
,表示: 在输入字符中获取所有不在 The
或 the
之后的所有单词 cat
。
"(?<!(T|t)he\s)(cat)" => The cat sat on cat.
标记
标记 | 描述 |
---|---|
i | 不区分大小写: 将匹配设置为不区分大小写。 |
g | 全局搜索: 搜索整个输入字符串中的所有匹配。 |
m | 多行匹配: 会匹配输入字符串每一行。 |
常用正则表达式
- 正整数:
^\d+$
- 负整数:
^-\d+$
- 电话号码:
^+?[\d\s]{3,}$
- 电话代码:
^+?[\d\s]+(?[\d\s]{10,}$
- 整数:
^-?\d+$
- 用户名:
^[\w\d_.]{4,16}$
- 字母数字字符:
^[a-zA-Z0-9]*$
- 带空格的字母数字字符:
^[a-zA-Z0-9 ]*$
- 密码:
^(?=^.{6,}$)((?=.*[A-Za-z0-9])(?=.*[A-Z])(?=.*[a-z]))^.*$
- 电子邮件:
^([a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4})*$
- IPv4 地址:
^((?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))*$
- 小写字母:
^([a-z])*$
- 大写字母:
^([A-Z])*$
- 网址:
^(((http|https|ftp):\/\/)?([[a-zA-Z0-9]\-\.])+(\.)([[a-zA-Z0-9]]){2,4}([[a-zA-Z0-9]\/+=%&_\.~?\-]*))*$
- VISA 信用卡号码:
^(4[0-9]{12}(?:[0-9]{3})?)*$
- 日期 (MM/DD/YYYY):
^(0?[1-9]|1[012])[- /.](0?[1-9]|[12][0-9]|3[01])[- /.](19|20)?[0-9]{2}$
- 日期 (YYYY/MM/DD):
^(19|20)?[0-9]{2}[- /.](0?[1-9]|1[012])[- /.](0?[1-9]|[12][0-9]|3[01])$
- 万事达信用卡号码:
^(5[1-5][0-9]{14})*$