正则表达式是一组由字母和符号组成的特殊文本,它可以用来从文本中找出满足你想要的格式的句子。一个正则表达式是一种从左到右匹配主体字符串的模式。Regular expression 这个词比较拗口,我们常使用缩写的术语 regex 或 regexp。正则表达式可以从一个基础字符串中根据一定的匹配模式替换文本中的字符串、验证表单、提取字符串等等。

在这里推荐一个练习正则匹配语法的网站:Regexp-正则在线练习


基本匹配

正则表达式其实就是在执行搜索时的格式,它由一些字母和数字组合而成。例如:一个正则表达式 the,它表示在目标字符串中检索三个连着的字母"t-h-e"。

the >>> The fat cat sat on the mat.

基本匹配中我们也可以看出正则的三个特点:

  1. 正则匹配是连续的。输入 the 就只会匹配 the,而不会匹配 thieth7e
  2. 正则匹配是有序的。输入 the 就只会匹配 the,而不会匹配 hteeth
  3. 正则匹配是大小写敏感的。输入 the 就只会匹配 the,而不会匹配 TheTHE

元字符

如果仅仅依靠上面的基本匹配模式,那么正则的作用就跟大多数编辑器的 Ctrl+F 没有任何区别。而正则的强大之处,在于可以通过丰富的元字符,简洁的表达复杂的匹配逻辑,以下是一些元字符的介绍:

元字符 描述
. 句号匹配任意单个字符除了换行符
[ ] 字符种类。匹配方括号内的任意字符
[^ ] 否定的字符种类。匹配除了方括号里的任意字符
* 匹配>=0个重复的在*号之前的字符
+ 匹配>=1个重复的+号前的字符
? 标记?之前的字符为可选
{n,m} 匹配num个大括号之前的字符或字符集 (n <= num <= m)
(xyz) 字符集,匹配与 xyz 完全相等的字符串
| 或运算符,匹配符号前或后的字符
\ 转义字符,用于匹配一些保留的字符 [ ] ( ) { } . * + ? ^ $ \ &#124;
^ 从开始行开始匹配
$ 从末端开始匹配

学会上面的这些内容,就足够应对正则表达式 90% 以上的使用场景了。


点运算符 .

. 是元字符中最简单的例子,表示匹配任意单个字符(除了换行符)。例如,表达式 .ar 匹配一个任意字符后面跟着是 ar 的字符串。

.ar >>> The car parked in the garage.

字符集 [ ] 与特征标群 ( )

字符集[ ]表示字符集(也叫做字符类),在方括号中使用连字符来指定字符集的范围。

[Tt]he  >>>  The car is parked in the garage.     (1)
[tT]he  >>>  The car is parked in the garage.     (2)
\[cg]ar  >>> The car is parked in the garage.     (3)
\[^cg]ar >>> The car is parked in the garage.     (4)
e[.]   >>>   The car is parked in the garage.     (5)

从上面的例子中,我们可以看出:

  1. 在方括号中的字符集是无序的。(1) 和 (2) 的匹配结果是相同的
  2. \[^ ] 表示不匹配括号以内的字符。相比 (3),(4) 没有匹配 car/gar,而是匹配了par
  3. [.] 可以用于匹配句号。(5) 能够匹配上末尾的 e.

特征标群( ) 表示特征标群( ) 中的内容将会被看成一个整体(和数学中小括号的作用相同)。

(9)+    >>>  The number was 9.9997 but we rounded it off to 10.0     (1)
(99)+   >>>  The number was 9.9997 but we rounded it off to 10.0     (2)
(99)+   >>>  The number was 9.9999 but we rounded it off to 10.0     (3)
(999)+  >>>  The number was 9.9997 but we rounded it off to 10.0     (4)

| 或运算符

或运算符就表示或,用作判断条件。例如 the|car 匹配 thecar

the|car  >>>  The car is parked in the garage.

*Tips:*我们还可以在()中用或字符 |表示或。

(c|g|p)ar    >>>  The car is parked in the garage.     (1)
(T|t)he|car  >>>  The car is parked in the garage.     (2)

从上面的例子中,我们可以看出:

  1. (c|g|p)ar 可以匹配 cargarpar
  2. (T|t)he|car 可以匹配 Thethecar

量词(+/*/?/{n,m}

量词 (Quantifier)。后面跟着元字符 +*? 的,用来指定前面元字符的重复次数。

a[a-z]+t  >>>  This cat is belong to my aunt.     (1)
a[a-z]*t  >>>  This cat is belong to my aunt.     (2)
a[a-z]?t  >>>  This cat is belong to my aunt.     (3)

从上面的例子中,我们可以看出:

  1. +*? 只对前面的第一个元字符起作用(例子中为[a-z]

  2. + 表示:匹配前一个元字符出现 ≥1 次。(1) 能看出来,a[a-z]+t 只会匹配 aunt,而不会匹配 at,这是因为 [a-z] 必须出现 ≥1 次,即中间跟着至少一个字符的字符串。

  3. * 表示:匹配前一个元字符出现 ≥0 次。(2) 能看出来,a[a-z]*t ataunt 都会匹配上,这是因为 [a-z] 必须出现 ≥0 次,即中间跟不跟字符均可。

  4. ? 表示:匹配前一个元字符出现 0 或 1 次。(3) 能看出来,a[a-z]?t 只会匹配 at,而不会匹配 aunt,这是因为 [a-z] 为可选,即出现 0 或 1 次。

Tips: * 字符和 . 字符搭配可以匹配所有的字符 .*

{n,m} 也是一个量词,用来限定前一个元字符可以重复出现的次数;即 n ≤ 重复次数 ≤ m。

  1. 表达式 [0-9]{2,3} 匹配 2 到 3 位,范围在 0~9 的数字。
  2. 表达式 [0-9]{2,} 匹配至少 2 位,范围在 0~9 的数字。
  3. 表达式 [0-9]{3} 表示匹配 (不多不少刚好) 3 位,范围在 0~9 的数字。
  4. [0-9] 并不是固定写法,例如 [fcsmat]{2,3} 表示匹配 2 到 3 位 [fcsmat] 这个字符集里的字母。
[0-9]{2,3}  >>>  The number was 9.9997 but we rounded it off to 10.0     (1)
[0-9]{2,}   >>>  The number was 9.9997 but we rounded it off to 10.0     (2)
[0-9]{3}    >>>  The number was 9.9997 but we rounded it off to 10.0     (3)
[fcsat]{2,3}  >>>  The fat cat sat on the mat.                           (4)

量词与匹配模式

所有带数量范围的正则量词*/+/?/{n,m} 等),都可以通过在量词后加 ? 切换为惰性匹配。正则表达式默认采用贪婪匹配模式 (Greedy matching),在该模式下意味着会匹配尽可能长的子串。我们可以使用 ? 将贪婪匹配模式转化为惰性匹配模式 (lazy matching)。我们以 * 量词为示例:

/(.*at)/  >>> The fat cat sat on the mat.
/(.*?at)/ >>> The fat cat sat on the mat.

特殊字符转码

正则表达式也是使用 \ 作为转义符的,可以对 { } [ ] / \ + * . $ ^ | ? 字符进行转义。以下为对 . 进行转义的例子:

[0-9].    >>>  The number was 9.9999 but we rounded it off to 10.0     (1)
[0-9]\\.  >>>  The number was 9.9999 but we rounded it off to 10.0     (2)

从上面的例子中,我们可以看出:

  1. 原本的 [0-9]. 是可以匹配 9.9910 的,因为 . 可以代表除换行符外的任一符号
  2. 但若为 [0-9]\\.,就只能匹配 9.0. 了,即 \\. 只能匹配到点符号 .

锚点(^/$

在正则表达式中,想要匹配指定开头或结尾的字符串就要使用到锚点。^指定从开头开始匹配,$ 指定从结尾开始匹配。

^(T|t)he >>> The caris parked in the garage.
age\\.$  >>> The caris parked in the garage.

简写字符集

正则表达式提供一些常用的字符集简写,用于快速匹配特定类型的字符:

简写 描述
. 除换行符外的所有字符
\w 匹配所有字母数字,等同于 [a-zA-Z0-9_]
\W 匹配所有非字母数字,即符号,等同于: [^\w]
\d 匹配数字: [0-9]
\D 匹配非数字: [^\d]
\s 匹配所有空格字符,等同于: [\t\n\f\r\p{Z}]
\S 匹配所有非空格字符: [^\s]
\f 匹配一个换页符
\n 匹配一个换行符
\r 匹配一个回车符
\t 匹配一个制表符
\v 匹配一个垂直制表符
\p 匹配 CR/LF(等同于 \r\n),用来匹配 DOS 行终止符
\u4e00-\u9fa5 匹配所有汉字

总结

  1. 简写字符集是正则的“快捷方式”,避免重复编写冗长的字符集 (如用\d代替[0-9])。核心常用集合:\d(数字)、\w(单词字符)、\s(空白)、.(任意字符),记住它们的反向形式。实际使用时,结合量词(如+*)可匹配连续的目标字符,提高效率。
  2. 大小写相反:所有小写简写(\d\w\s)的大写形式(\D\W\S)都表示 “反向匹配”,这是正则的通用规则
  3. \w 的范围\w 在 Python 中默认支持 Unicode,会匹配中文等非英文单词字符(如示例中匹配到 “用户名”),如果需要仅匹配英文,需指定 re.ASCII 标志
  4. . 的限制. 默认不匹配换行符 \n,如果需要匹配包括换行符在内的所有字符,可使用 re.DOTALL 标志(或在正则开头加 (?s)

零宽度断言(前后预查)

先行断言和后发断言(合称 lookaround)都属于非捕获组(用于匹配模式,但不包括在匹配列表中)。当我们需要一个模式的前面或后面有另一个特定的模式时,就可以使用它们。例如,我们希望从下面的输入字符串 $4.44$10.88 中获得所有以 $ 字符开头的数字,我们将使用以下的正则表达式 (?<=\$)[0-9\.]*。意思是:获取所有包含 . 并且前面是 $ 的数字。

零宽度断言有如下 4 种形式:

  • ?=:正先行断言-存在
  • ?!:负先行断言-排除
  • ?<=:正后发断言-存在
  • ?<!:负后发断言-排除

由此可以总结出零宽度断言在格式上的规律。 ? 代表零宽度断言的开始,后接 =! 分别代表存在(正)和排除(负),这是先行断言。如果是后发断言,则在 ?=/! 之间插入 <

(?=...) 正先行断言

?=... 正先行断言,表示第一部分表达式之后必须跟着 ?=...定义的表达式。返回结果只包含满足匹配条件的第一部分表达式。定义一个正先行断言要使用 ()。在括号内部使用一个问号和等号:(?=...)。正先行断言的内容写在括号中的等号后面。例如,表达式 (T|t)he(?=\sfat) 匹配 Thethe,在括号中我们又定义了正先行断言 (?=\sfat) ,即 Thethe 后面紧跟着 (空格)fat

(T|t)he(?=\sfat)  >>> The fat cat sat on the mat.
(T|t)he(?=\s\wat) >>> The fat cat sat on the mat.

(?!...) 负先行断言

负先行断言 ?! 用于筛选所有匹配结果,筛选条件为其后不跟随着断言中定义的格式。负先行断言定义和正先行断言一样,区别就是 = 替换成 ! 也就是 (?!...)。表达式 (T|t)he(?!\sfat) 匹配 Thethe,且其后不跟着 (空格)fat

(T|t)he(?!\sfat) >>> The fat cat sat on the mat.

(?<=...) 正后发断言

正后发断言 记作 (?<=...) 用于筛选所有匹配结果,筛选条件为其前跟随着断言中定义的格式。例如,表达式 (?<=(T|t)he\s)(fat|mat) 匹配 fatmat,且其前跟着 Thethe。如果只想匹配在 The 后面的,就使用表达式 (?<=The\s)(fat|mat)

(?<=(T|t)he\s)(fat|mat) >>> The fat cat sat on the mat.
(?<=The\s)(fat|mat)   >>>   The fat cat sat on the mat.

(?<!...) 负后发断言

负后发断言 记作 (?<!...) 用于筛选所有匹配结果,筛选条件为其前不跟随着断言中定义的格式。例如,表达式 (?<!(T|t)he\s)(cat) 匹配 cat,且其前不跟着 Thethe

(?<!(T|t)he\s)(cat) >>> The fat cat sat on the cat.

模式修正符(标志)

标志也叫模式修正符,因为它可以用来修改表达式的搜索结果。这些标志可以任意的组合使用,它也是整个正则表达式的一部分。

标志 全称 描述
g global 全局搜索,匹配全部可匹配结果。
m multi line 多行模式,此模式下 ^ $ 可以分别匹配行首和行尾。
i insensitive 忽略大小写。
s single line 单行模式,此模式下 . 能匹配任意字符(包括换行符)。
u ungreedy 使量词默认为非贪婪模式。
x extended 忽略空白字符,可以多行书写,并使用 # 进行注释说明。

这里正好补充说明一下。不同语言对于正则的处理语法可能是不一样的。以 python 和 JS 为例。在 JS 中使用 / 作为界定符

// 正确用法:用 / / 包裹正则,实现匹配
const regex = /.(at)/g; // 有定界符,是正则表达式
const str = "cat hat bat dog";

// 1. 匹配结果
const matches = str.match(regex);
console.log(matches); // 输出:['cat', 'hat', 'bat'](全局匹配到3个)

// 2. 替换示例
const newStr = str.replace(regex, "动物-$1"); // $1 引用分组 (at)
console.log(newStr); // 输出:'动物-at 动物-at 动物-at dog'

// 错误用法:没有定界符(会报错)
// const wrongRegex = .(at); // 语法错误:无法识别 .(at)
// const wrongRegex = '(at)'; // 这是字符串,不是正则,无法调用正则方法

而 python 中不使用 /g 诸如此类的写法。python 中没有 / 定界符,也没有 g 修饰符,正则表达式直接用字符串表示(建议加 r 前缀表示原始字符串,避免转义字符干扰),全局匹配通过 re 模块的特定方法实现。

import re

# 1. 定义正则表达式(Python 用原始字符串 r"",无需 / 定界符)
# 对应 JS 的 /.(at)/g,Python 用 re.findall() 实现全局匹配
regex = r".(at)"  # r 前缀避免转义,.(at) 是核心匹配规则

# 2. 待匹配的字符串
text = "cat hat bat dog sat mat"

# 3. 全局匹配(关键:用 re.findall() 替代 JS 的 g 修饰符)
matches = re.findall(regex, text)

# 输出结果
print("全局匹配到的结果:", matches)  # 输出:['at', 'at', 'at', 'at', 'at']

# 4. 补充:如果想匹配完整子串(如 'cat' 而非仅分组 'at'),调整正则(去掉不必要的分组)
regex_full = r".at"  # 去掉括号,匹配完整的 "xat" 结构
full_matches = re.findall(regex_full, text)
print("匹配完整子串的结果:", full_matches)  # 输出:['cat', 'hat', 'bat', 'sat', 'mat']

# 5. 其他常用方法(按需使用,替代 JS 的不同匹配场景)
# 逐个匹配(类似 JS 的 exec() 循环)
iterator = re.finditer(regex_full, text)
for match in iterator:
    print(f"匹配到:{match.group()}, 位置:{match.start()}-{match.end()}")

# 输出:
"""
匹配到:cat, 位置:0-3
匹配到:hat, 位置:4-7
匹配到:bat, 位置:8-11
匹配到:sat, 位置:16-19
匹配到:mat, 位置:20-23
"""

在这一小节,我们使用 JS 的语法进行说明,让模式修正符的语法显得更加的简洁一些。

忽略大小写 (Case Insensitive)

修饰语 i 用于忽略大小写。例如,表达式 /The/gi 表示在全局搜索 The,在后面的 i 将其条件修改为忽略大小写,则变成搜索 theTheg 表示全局搜索。

The >>> The fat cat sat on the mat.
/The/gi >>> The fat cat sat on the mat.

全局搜索 (Global search)

修饰符 g 常用于执行一个全局搜索匹配,即(不仅仅返回第一个匹配的,而是返回全部)。例如,表达式 /.(at)/g 表示搜索 任意字符(除了换行)+ at,并返回全部结果。

/.(at)/ >>> The fat cat sat on the mat.
/.(at)/g >>> The fat cat sat on the mat.

多行修饰符 (Multiline)

多行修饰符 m 常用于执行一个多行匹配。像之前介绍的 (^,$) 用于检查格式是否是在待检测字符串的开头或结尾。但我们如果想要它在每行的开头和结尾生效,我们需要用到多行修饰符 m。例如,表达式 /at(.)?$/gm 表示小写字符 a 后跟小写字符 t ,末尾可选除换行符外任意字符。根据 m 修饰符,现在表达式匹配每行的结尾。

/.at(.)?$/  >>>  The fat
cat sat
on the mat.
/.at(.)?$/gm >>> The fat
cat sat
on the mat.

总结

  1. 正则是大小写敏感的;

参考文档


正则练习题

练习方式

在线网站:regex101: build, test, and debug regex

#!/usr/bin/python
# -*- coding: UTF-8 -*- 
 
import re
print(re.search('www', 'www.runoob.com').span())  # 在起始位置匹配
print(re.search('com', 'www.runoob.com').span())  # 不在起始位置匹配

"""
(0, 3)
(11, 14)
"""

也可以将匹配到的字符串片段打印出来:

#!/usr/bin/python
# -*- coding: UTF-8 -*- 

import re

def re_print(line, a):
print(line[a[0]:a[1]])

line = 'www.runoob.com'
print(line)

a = re.search('www', line).span()     # 在起始位置匹配
re_print(line, a)

a = re.search('com', line).span()  # 不在起始位置匹配
re_print(line, a)

"""
www.runoob.com
www
com
"""

或者使用findall方法:

# -*- coding:UTF8 -*-
 
import re
 
pattern = re.compile(r'\d+')   # 查找数字
result1 = pattern.findall('runoob 123 google 456')
result2 = pattern.findall('run88oob123google456', 0, 10)
 
print(result1)
print(result2)

"""
['123', '456']
['88', '12']
"""

题目 01-10

\ 1: \d,\W,\s,\B,.,*,+,?分别是什么?
\ 2: (?=a),(?<!a),(?<=a),(?!a)分别是什么?
\ 3: 什么是贪婪匹配和懒惰匹配?
\ 4: \d{1,2}*这样的写法对吗?请说明理由。
\ 5: 怎么让正则表达式从字符串的右边开始匹配?
\ 6: 写出验证用户名的正则表达式,用户名只能输入英文、数字和下划线。
\ 7: 写出验证用户名的正则表达式,用户名只能输入汉字、英文、数字和下划线。
\ 8: 验证用户密码,长度在6~18 之间,只能包含英文和数字。
\ 9: 验证用户密码强度,最少6位,至少包括1个大写字母、1个小写字母、1个数字和1个特殊字符。
\10: 匹配QQ号。

题目 11-20

\11: 匹配Email地址。
\12: 匹配手机号。
\13: 匹配固定电话号码。
\14: 用正则表达式分别提取固定电话号码中的区号和电话号。
\15: 匹配身份证号码。
\16: 匹配出身份证号码中的区域代码。
\17: 用正则表达式匹配出身份证号中的出生日期。
\18: 匹配银行卡号。
\19: 匹配邮政编码。
\20: 匹配包含送货地址的字符串。

题目 21-30

\21: 匹配车牌号。
\22: 匹配整数。
\23: 匹配非零的负整数。
\24: 匹配非零的正整数。
\25: 匹配浮点数。
\26: 匹配非负浮点数。
\27: 匹配以下HTML中的文本信息:
     +--------------------------------------------------------------+
     |  <!DOCTYPE html>                                             |
     |  <html>                                                      |
     |   <head>                                                     |
     |    <title>徐清风</title>                                     |
     |   </head>                                                    |
     |   <body>                                                     |
     |    <h2> <a>微信公众号: <em>转行学数据分析</em> </a> </h2>    |
     |   </body>                                                    |
     |  </html>                                                     |
     +--------------------------------------------------------------+
\28: 匹配以下HTML中的URL:
 <link rel="search" href="https://www.baidu.com" /> 
\29: 匹配HTML标记。
\30: 匹配<a <123> <456> a>中的数字。

题目 31-40

\31: 匹配<a <123 <456> a>中的数字。
\32: 匹配以.com结尾的web域名。
\33: 匹配IP地址。
\34: 匹配MAC地址。
\35: 匹配文件名的后缀(注意文件名中可能出现.号)
\36: 匹配文件名(注意文件名中可能出现.号)。
\37: 匹配汉字。
\38: 匹配AABB型成语。
\39: 匹配ABAB型成语。
\40: 匹配yyyy-mm-dd格式的日期。

题目 41-50

\41: 使用正则表达式让2020-05-20 变成 2020.05.20
\42: 使用正则表达式给数字加上千分符。
\43: 去除字符串中的中文。
\44: 去除字符串中的特殊字符。
\45: 去除字符串中的空白字符。
\46: 匹配第一个连续出现的字符。
\47: 使用正则表达式给数字前加两0:
     111111111
     222222222
     转变为
     00111111111
     00222222222
\48: 使用正则表达式变换文本格式:
     000000001
     000000002
     转变为
     '000000001',
     '000000002'
\49: 使用正则表达式变换文本格式:
     000000001
     000000002
     转变为
     000000001,000000002
\50: 使用正则表达式变换文本格式:
 id:0000001 name:徐清风 转变为 'id':'0000001', 'name':'徐清风'

附录A:正则表达式快速参考

正则表达式(Regular Expression, Regex)是用于匹配和处理文本的强大模式。PowerShell 在 -match, -split, -replace 等运算符和 Select-String Cmdlet 中广泛使用它。

分类 符号/序列 描述 示例
基本字符 . 匹配除换行符外的任意单个字符。 a.c 匹配 “abc”, “a_c”, “a1c”
\d 匹配任意一个数字 (等同于 [0-9])。 \d{3} 匹配 “123”
\w 匹配任意一个单词字符 (字母、数字、下划线)。 \w+ 匹配 “word1_23”
\s 匹配任意一个空白字符 (空格, Tab, 换行符)。 a\sb 匹配 “a b”
\D, \W, \S 分别与 \d, \w, \s 相反。 \D 匹配 “a”, “_”
量词 * 匹配前面的元素 0 次或多次。 a\*b 匹配 “b”, “ab”, “aaab”
+ 匹配前面的元素 1 次或多次。 a+b 匹配 “ab”, “aaab”
? 匹配前面的元素 0 次或 1 次。 colou?r 匹配 “color”, “colour”
{n} 匹配前面的元素恰好 n 次。 \d{4} 匹配 “2023”
{n,} 匹配前面的元素至少 n 次。 \d{2,} 匹配 “12”, “1234”
{n,m} 匹配前面的元素至少 n 次,但不超过 m 次。 \w{3,5} 匹配 “cat”, “house”
锚点 ^ 匹配字符串的开头。 ^start 匹配 “Start of line”
$ 匹配字符串的结尾。 end$ 匹配 “This is the end”
\b 匹配单词边界。 \bword\b 匹配 “word” 但不匹配 “wording”
分组与范围 […] 匹配方括号内的任意一个字符。 [aeiou] 匹配任意一个小写元音
[^…] 匹配任意一个在方括号内的字符。 [^0-9] 匹配任意非数字字符
( … ) 分组,将多个元素视为一个整体,并用于捕获。 (ab)+ 匹配 “ab”, “abab”
| 或,匹配左边或右边的表达式。 a|b 匹配 “a” 或 “b”
转义 \ 转义特殊字符,使其被视为普通字符。 C:\\Temp 匹配 “C:\Temp”

附录B:常用正则表达式

  1. 身份证:行政区号编码+年份+月份+日期+0-9的数字重复3次+最后一位检验位

    ^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$
    
    ^[1-9]\d{5}                       # 行政区号编码:421002
    (18|19|([23]\d))\d{2}             # 年份:18 、 19 、 2或者3开头再接一个0-9的数字 , 然后再接2位0-9的数字
    ((0[1-9])|(10|11|12))             # 月份:0开头然后接一个1-9的数字、或者是10、11、12
    (([0-2][1-9])|10|20|30|31)        # 日期:0-2的数字接一个1-9的数字、或者是10、20、30、31
    \d{3}                             # 0-9的数字重复3次
    [0-9Xx]$                          # 最后一位为检验位:0-9或者是X、X
    
  2. 手机号

    # (严谨), 根据工信部2019年最新公布的手机号段
    /^(?:(?:\+|00)86)?1(?:(?:3[\d])|(?:4[5-79])|(?:5[0-35-9])|(?:6[5-7])|(?:7[0-8])|(?:8[\d])|(?:9[1589]))\d{8}$/
    
    /^(?:(?:\+|00)86)?1[3-9]\d{9}$/   # 宽松匹配,只要是13,14,15,16,17,18,19开头即可
    /^(?:(?:\+|00)86)?1\d{10}$/       # (最宽松), 只要是1开头即可
    
  3. 邮箱

    [a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(?:\.[a-zA-Z0-9_-]+)
    
  4. 18 位身份证账号

    [1-9]\d{5}(?:18|19|(?:[23]\d))\d{2}(?:(?:0[1-9])|(?:10|11|12))(?:(?:[0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]
    
  5. 国内电话号码

    1(3|4|5|6|7|8|9)\d{9}             # 国内手机号码
    \d{3}-\d{8}|\d{4}-\d{7}           # 国内固定电话
    
  6. 域名

    (?:(?:http:\/\/)|(?:https:\/\/))?(?:[\w](?:[\w\-]{0,61}[\w])?\.)+[a-zA-Z]{2,6}(?:\/)
    
  7. IP 地址

    ((?:(?:25[0-5]|2[0-4]\d|[01]?\d?\d)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d?\d))
    
  8. 日期:常见日期格式:yyyyMMdd、yyyy-MM-dd、yyyy/MM/dd、yyyy.MM.dd

    \d{4}(?:-|\/|.)\d{1,2}(?:-|\/|.)\d{1,2}
    
  9. 国内邮政编码

    [1-9]\d{5}(?!\d)
    
  10. 密码

    [a-zA-Z]\w{5,17}
    [a-zA-Z](?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}
    
  11. 中文字符

    [\u4e00-\u9fa5]
    
  12. 数字

    ^[0-9]*$                                                           # 验证数字
    ^\d{n}$                                                            # 验证n位的数字
    ^\d{n,}$                                                           # 验证至少n位数字
    ^\d{m,n}$                                                          # 验证m-n位的数字
    ^(0|[1-9][0-9]*)$                                                  # 验证零和非零开头的数字
    ^[0-9]+(.[0-9]{2})?$                                               # 验证有两位小数的正实数
    ^[0-9]+(.[0-9]{1,3})?$                                             # 验证有1-3位小数的正实数
    ^\+?[1-9][0-9]*$                                                   # 验证非零的正整数
    ^\-[1-9][0-9]*$                                                    # 验证非零的负整数
    ^\d+$                                                              # 验证非负整数(正整数 + 0) 
    ^((-\d+)|(0+))$                                                    # 验证非正整数(负整数 + 0) 
    ^-?\d+$                                                            # 整数:
    ^\d+(\.\d+)?$                                                      # 非负浮点数(正浮点数 + 0)
    ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$     # 正浮点数
    ^((-\d+(\.\d+)?)|(0+(\.0+)?))$                                     # 非正浮点数 (负浮点数+0)
    ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$  # 负浮点数
    ^(-?\d+)(\.\d+)?$                                                  # 浮点数
    
  13. 字符串

    ^[A-Za-z0-9]+$^[A-Za-z0-9]{4,40}$                              # 英文和数字
    ^.{3,20}$                                                          # 长度为3-20的所有字符
    ^[A-Za-z]+$                                                        # 由26个英文字母组成的字符串
    ^[A-Z]+$                                                           # 由26个大写英文字母组成的字符串
    ^[a-z]+$                                                           # 由26个小写英文字母组成的字符串
    ^[A-Za-z0-9]+$                                                     # 由数字和26个英文字母组成的字符串
    ^\w+$^\w{3,20}$                                                # 由数字、26个英文字母或者下划线组成的字符串
    ^[\u4E00-\u9FA5A-Za-z0-9_]+$                                       # 中文、英文、数字包括下划线
    ^[\u4E00-\u9FA5A-Za-z0-9]+$^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$    # 中文、英文、数字但不包括下划线等符号
    [^%&',;=?$\x22]+                                                   # 可以输入含有^%&',;=?$\等字符
    [^~\x22]+                                                          # 禁止输入含有~的字符
    
  14. 统一社会信用代码

    /^[0-9A-HJ-NPQRTUWXY]{2}\d{6}[0-9A-HJ-NPQRTUWXY]{10}$/
    /^(([0-9A-Za-z]{15})|([0-9A-Za-z]{18})|([0-9A-Za-z]{20}))$/        # 宽松匹配