本文介绍了正则表达式的基础知识及常用表达式
直接匹配
也就是和正常搜索一样,直接输入一个字符串。正则表达式会对我们输入的字符串进行全文匹配。例如:
-
aeiou✔ aeiou
✔ fskaeiouvd
❌ aeiuo
❌ eiou
❌ aetiou
范围匹配
我们使用方括号 [] 进行范围匹配,正则表达式会匹配到方括号中的任一一个字符。例如:
-
[aeiou]✔ e
✔ tia
❌ s
❌ sdfg
多个方括号并排则依次匹配。例如
-
[aeiou][aeiou]✔ uu
✔ ea
✔ tia
❌ e
❌ as
-
[aeiou][sdfg]✔ us
✔ sus
❌ su
-
a[aeiou]✔ as
✔ sas
❌ su
❌ ea
如果前面加上^,也可以匹配除了方括号内所有字符以外的字符。例如:
-
[^aeiou]✔ t
✔ as
❌ a
❌ aei
可以用小短横表示范围,常用在数字、大小写字母上。例如:
-
[2-7]✔ 3
✔ s5t
❌ s
❌ 8
-
[a-z]✔ b
✔ 3cs
❌ B
-
[a-zA-Z]✔ b
✔ B
❌ 2
限定匹配
当我们需要重复前面的内容 n 次时,使用大括号 {n}。例如:
-
[2-7]{5}✔ 34736
✔ s34736t34736
❌ 347s36
❌ 347
❌ 347367
-
a[2-7]{5}✔ a34736
✔ sa34736t
❌ as34736
当我们需要重复前面的内容至少 n 次时,使用大括号 {n,}。例如:
-
[2-7]{3,}✔ 347
✔ 34736
❌ 34
当我们需要重复前面的内容至少 n 次至多 m 次时,使用大括号 {n,m}。例如:
-
[2-7]{3,5}✔ 347
✔ 3473
❌ 34
❌ 347367
我们使用星号 * 表示 {0,} 的相同意思。例如:
-
[2-7]*✔ 347
✔ **
❌ a
我们使用加号 + 表示 {1,} 的相同意思。例如:
-
[2-7]+✔ 347
❌ 3
我们使用问号 ? 表示 {0,1} 的相同意思。例如:
-
[2-7]?✔ 3
✔ **
❌ 34
特殊匹配
我们使用竖线 | 表示或。例如:
-
[2-7]|[a-z]✔ 2
✔ a
❌ 8
加了小括号的表达式可以视作子表达式。例如:
-
([2-7]|[a-z])*✔ 222asf4
✔ afgr33f
一些特殊字符可以用斜杠 / 表示。例如:
\n换行\r回车\f换页\t制表符\v垂直制表符\s相当于[\n\r\f\t\v]\S相当于[^\n\r\f\t\v]\w相当于[A_Za_z0-9_]\d相当于[0-9]
还有一些特殊的匹配符。例如:
.相当于[^\n\r]
一些符号用于定位。例如:
$匹配字符串结束位置^如果不在中括号[]中,则匹配字符串开始位置\b匹配单词边界\B匹配非单词边界
对于上面提到的符号,如果要匹配它们本身,需要在前面加上斜杠 \。例如:
\?\[\$
断言
使用 exp1(?=exp2) 查找 exp2 前面的 exp1。例如:
-
a(?=[\d+])✔ 123a123aba
同理,
使用 (?<=exp2)exp1 查找 exp2 后面的 exp1。
使用 exp1(?!exp2) 查找后面不是 exp2 的 exp1。
使用 (?<!exp2)exp1 查找前面不是 exp2 的 exp1。
一些常用例子
- 可以输入含有
^%&',;=?$\"等字符:[^%&',;=?$\x22]+ - 禁止输入含有
~的字符:[^~\x22]+ - Email地址:
^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$ - 域名:
[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.? - InternetURL:
[a-zA-z]+://[^\s]*或^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$ - 手机号码:
^(13[0-9]|14[0-9]|15[0-9]|16[0-9]|17[0-9]|18[0-9]|19[0-9])\d{8}$ - 国内固定电话号码:
\d{3}-\d{8}|\d{4}-\d{7} - 18位身份证号码:
^((\d{18})|([0-9x]{18})|([0-9X]{18}))$ - 帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):
^[a-zA-Z][a-zA-Z0-9_]{4,15}$ - 密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):
^[a-zA-Z]\w{5,17}$ - 强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-14之间):
^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,14}$ - 日期格式:
^\d{4}-\d{1,2}-\d{1,2} - 一年的12个月:
^(0?[1-9]|1[0-2])$ - 一个月的31天(01~09和1~31):
^((0?[1-9])|((1|2)[0-9])|30|31)$ - xml文件:
^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$ - 中文字符:
[\u4e00-\u9fa5] - 双字节字符:
[^\x00-\xff] - 空白行:
\n\s*\r - HTML标记:
<(\S*?)[^>]*>.*?</\1>|<.*? /> - 首尾空白字符:
^\s*|\s*$或(^\s*)|(\s*$) - 腾讯QQ号:
[1-9][0-9]{4,} - 中国邮政编码:
[1-9]\d{5}(?!\d) - IP地址:
\d+\.\d+\.\d+\.\d+ - IP地址:
((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))
Comments