常用正则表达式
By Vincent. @2023.10.9
1 正则表达式过滤中国身份证号
^[1-9]\d{5}(19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}(\d|X|x)$
中国大陆的居民身份证号是一个结构特定的18位数字串,其中最后一位可能是数字或字母X
。它的结构如下:
- 前6位:行政区划代码,代表持卡人出生地。
- 中间8位:生日,格式为YYYYMMDD。
- 接下来的3位:顺序码,奇数分配给男性,偶数分配给女性。
- 最后1位:校验码,可以是0-9或
X
。
这个正则表达式的结构如下:
^[1-9]\d{5}
:匹配前6位的行政区划代码,确保它不以0开头。(19|20)
:匹配生日中的前两位,这里简单地假设年份在1900-2099之间。\d{2}
:匹配生日中的后两位。(0[1-9]|1[0-2])
:匹配月份,确保它在01到12之间。(0[1-9]|[12]\d|3[01])
:匹配日期,确保它在01到31之间。\d{3}
:匹配顺序码。(\d|X|x)$
:匹配校验码,可以是0-9或X
(大写或小写)。
请注意,这个正则表达式只做了基本的结构验证,并没有对校验码进行严格的校验。如果你需要对身份证号进行完整验证,还需要额外的算法来计算和验证校验码。
2 正则表达式过滤中国大陆正确的手机号
在中国大陆,手机号通常有11位数字。目前(到我最后的训练数据为止,即2022年1月),常见的手机号码前三位(即区号)有以下几种:
133, 135-139, 147, 150-153, 155-159, 166, 170-173, 175-178, 180-189, 191, 198-199
基于这些信息,一个相对简单的正则表达式用于匹配这些手机号码为:
^((13[0-9])|(14[5,7,9])|(15[^4,\D])|(16[6])|(17[0-8])|(18[0-9])|(19[1,8,9]))\d{8}$
这个正则表达式考虑了以下几点:
^
:开始符号。(...)|(...)|...
:用|
符号区分的多个可能的模式,匹配手机号的前三位。\d{8}
:匹配手机号码的后8位数字。$
:结束符号。
3 正则表达式过滤正确的邮箱格式
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
让我们来分析这个正则表达式:
^
:这表示字符串的开始。[a-zA-Z0-9._%+-]+
:这匹配了邮箱地址的用户名部分,允许使用字母、数字和特殊字符(如点、下划线、百分号、加号和减号)。@
:这匹配了电子邮件地址中的@符号。[a-zA-Z0-9.-]+
:这匹配了电子邮件地址的域名前缀,允许使用字母、数字和点或减号。\.
:这匹配了电子邮件地址中的点号。[a-zA-Z]{2,}
:这匹配了顶级域(例如.com、.org等)。它要求至少有两个字母的顶级域,这样就可以匹配像.com、.org、.uk等。$
:这表示字符串的结束。
4 正则表达式过滤正确的http以及https请求
要匹配一个有效的 HTTP 或 HTTPS URL,我们需要考虑以下几个组件:
- 协议:
http
或https
- 域名:例如
example.com
。域名可以包括子域名,如sub.example.com
- 端口(可选):例如
:8080
- 路径(可选):例如
/path/to/resource
- 查询参数(可选):例如
?id=1&name=test
- 锚点(可选):例如
#section1
基于以上的组件,以下是一个简单的正则表达式来匹配 HTTP 和 HTTPS URLs:
^(https?):\/\/(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+[A-Z]{2,6}\.?|localhost|\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}|(?:[A-F0-9]{1,4}:){7}[A-F0-9]{1,4})(?::\d+)?(?:\/?|[\/?]\S+)$
这个正则表达式考虑了以下几点:
^(https?):\/\/
: 匹配http
或https
协议开始。(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+[A-Z]{2,6}\.?
: 匹配大多数有效的域名,包括子域名。|localhost
: 匹配本地主机。|\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}
: 匹配IPv4地址。|(?:[A-F0-9]{1,4}:){7}[A-F0-9]{1,4}
: 匹配IPv6地址。(?::\d+)?
: 匹配可选的端口号。(?:\/?|[\/?]\S+)$
: 匹配URL的路径、查询参数和锚点。
5 正则表达式过滤正确的中国银行卡号
中国的银行卡号一般为16到19位数字。大部分银行卡都遵循Luhn算法(又称为“模10算法”)进行校验。基于这些信息,一个简单的正则表达式,用于匹配可能的银行卡号长度为:
^\d{16,19}$
这个正则表达式只能确定卡号由16到19位数字组成,但并没有执行Luhn算法校验。
如果你还希望使用正则表达式以外的代码来进行Luhn算法校验,以下是一个简单的Python例子:
def luhn_check(card_number):
total = 0
reverse_digits = card_number[::-1]
for i, digit in enumerate(reverse_digits):
n = int(digit)
if i % 2 == 1:
n *= 2
if n > 9:
n -= 9
total += n
return total % 10 == 0
card_number = "你的卡号"
if luhn_check(card_number):
print("卡号可能有效")
else:
print("无效卡号")