一.正则表达式的使用方法
在 bash
中使用正则表达式通常是结合 [[ ... ]]
结构和 =~
操作符,=~
:这是 bash
中用于正则表达式匹配的操作符,它会将左边的字符串和右边的正则表达式进行匹配。
基本语法如下:
if [[ $string =~ regex ]]; then
# 匹配成功时执行的代码
else
# 匹配失败时执行的代码
fi
这里的 $string 是要进行匹配的字符串,regex 是正则表达式。
[0-9]+(\.[0-9]+)?$
:这是一个正则表达式,具体含义如下:
^
:表示字符串的开始位置。
[0-9]+
:[0-9]
是一个字符类,用于匹配 0 到 9 之间的任意数字;+
是量词,表示前面的字符类至少出现 1 次,也就是匹配一个或多个数字。
(\.[0-9]+)
:这是一个捕获组,\.
用于匹配小数点(由于小数点在正则里有特殊含义,所以要用反斜杠转义);[0-9]+
同样表示匹配一个或多个数字。整体来看,这个捕获组的作用是匹配小数点后面跟着一个或多个数字的情况。
?
:这个量词作用于前面的捕获组 (\.[0-9]+)
,使得该捕获组变为可选的。这意味着小数点及其后面的数字可以出现,也可以不出现。
$
:表示字符串的结束位置。
二.常用的正则表达式示例
以下是一些常见的正则表达式及其用途:
1. 匹配数字
整数:^[0-9]+$
这个正则表达式用于匹配由一个或多个数字组成的字符串,也就是整数。例如:
string="123"
if [[ $string =~ ^[0-9]+$ ]]; then
echo "匹配成功,是整数"
else
echo "匹配失败"
fi
小数:^[0-9]+(\.[0-9]+)?$
这个正则表达式用于匹配整数或小数。例如:
string="3.14"
if [[ $string =~ ^[0-9]+(\.[0-9]+)?$ ]]; then
echo "匹配成功,是数字"
else
echo "匹配失败"
fi
2. 匹配邮箱地址
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
这个正则表达式用于匹配常见的邮箱地址。例如:
email="example@example.com"
if [[ $email =~ ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ ]]; then
echo "匹配成功,是有效的邮箱地址"
else
echo "匹配失败"
fi
[a-zA-Z0-9._%+-]+
字符类 [a-zA-Z0-9._%+-]
:这个字符类定义了允许出现在邮箱用户名部分的字符集合,具体包括:
a-zA-Z
:表示所有大小写英文字母。
0-9
:表示所有数字。
.
、_
、%
、+
、-
:这些是一些特殊字符,在邮箱用户名中是合法的。
量词 +
:表示前面的字符类至少出现一次,也就是邮箱用户名部分至少要有一个合法字符。
@
作用:匹配邮箱地址中的 @
符号,它是邮箱地址的标志性分隔符,用于分隔用户名和域名。
[a-zA-Z0-9.-]+
字符类 [a-zA-Z0-9.-]
:定义了允许出现在邮箱域名部分(@
后面到最后一个点之前)的字符集合,包括大小写英文字母、数字、点号 .
和连字符 -
。
量词 +
:表示前面的字符类至少出现一次,即域名部分至少要有一个合法字符。
\.
作用:匹配邮箱地址中的最后一个点号 .
。由于点号在正则表达式中有特殊含义(匹配任意字符),所以需要使用反斜杠 \
进行转义,以表示匹配真正的点号。
[a-zA-Z]{2,}
字符类 [a-zA-Z]
:表示所有大小写英文字母。
量词 {2,}
:表示前面的字符类至少出现两次,这是为了匹配邮箱地址中的顶级域名(如 .com
、.org
、.cn
等),顶级域名通常由至少两个字母组成。
{2,}
表示前面的元素(在这里是 [a-zA-Z]
)至少要出现 2 次(个,就com三个符合,c一个就不符合),并且出现次数没有上限。简单来说,它规定了某部分内容的最少出现次数,但对最多出现次数不做限制。
3. 匹配手机号码
^1[3-9]\d{9}$
在中国,手机号码通常以 1 开头,第二位是 3 - 9 中的一个数字,后面跟着 9 位数字。例如:
phone="13800138000"
if [[ $phone =~ ^1[3-9]\d{9}$ ]]; then
echo "匹配成功,是有效的手机号码"
else
echo "匹配失败"
fi
\d
:这是一个元字符,在正则表达式里代表任意一个数字字符,等同于字符类 [0 - 9]
。也就是说,\d
可以匹配 0 到 9 之间的任意一个数字。
{9}
:这是一个量词,它作用于紧挨着它前面的元素,也就是 \d
。{9}
表示前面的元素(即数字)必须连续出现 9 次。
综合起来,\d{9}
就是要匹配连续的 9 个数字。在匹配手机号码时,它能匹配手机号码中除去前两位(第一位固定为 1,第二位是 3 - 9 中的一个数字)之后的那 9 位数字。
如果要匹配固定格式的 6 位验证码,可以使用正则表达式 ^\d{6}$
,其中 \d{6}
表示匹配连续的 6 位数字。示例代码如下:
code="123456"
if [[ $code =~ ^\d{6}$ ]]; then
echo "匹配成功,是有效的验证码"
else
echo "匹配失败"
fi
4. 匹配日期(YYYY-MM-DD 格式)
^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$
这个正则表达式用于匹配YYYY-MM-DD
格式的日期。例如:
date="2025-05-04"
if [[ $date =~ ^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$ ]]; then
echo "匹配成功,是有效的日期"
else
echo "匹配失败"
fi
[0-9]{4}
[0-9]
:这是一个字符类,表示匹配任意一个数字(0 到 9)。
{4}
:这是一个量词,作用于前面的 [0-9]
,表示前面的元素(数字)必须连续出现 4 次。
整体作用:匹配日期中的年份部分,要求年份为 4 位数字。例如,2025
就满足 [0-9]{4}
的匹配规则。
-
作用:匹配日期格式中的连字符 -
,用于分隔年份、月份和日期。
用法:直接使用 -
字符来匹配实际日期字符串中的连字符。
(0[1-9]|1[0-2])
()
:这是一个捕获组,用于将其中的内容作为一个整体进行处理,同时可以对其进行引用或应用量词等操作。
0[1-9]
:表示匹配以 0
开头,后面跟着 1 到 9 之间任意一个数字的字符串。这样可以匹配 01 到 09 的月份。
|
:这是一个或运算符,表示在它两边的表达式只要有一个匹配成功即可。
1[0-2]
:表示匹配以 1
开头,后面跟着 0 到 2 之间任意一个数字的字符串,用于匹配 10 到 12 的月份。
整体作用:匹配日期中的月份部分,确保月份在 01 到 12 之间。
(0[1-9]|[12][0-9]|3[01])
0[1-9]
:匹配以 0
开头,后面跟着 1 到 9 之间任意一个数字的字符串,用于匹配 01 到 09 的日期。
[12][0-9]
:表示匹配以 1 或 2 开头,后面跟着 0 到 9 之间任意一个数字的字符串,用于匹配 10 到 29 的日期。
3[01]
:表示匹配以 3
开头,后面跟着 0 或 1 的字符串,用于匹配 30 或 31 的日期。
整体作用:匹配日期中的日部分,确保日期在 01 到 31 之间。