正则表达式是什么?Regex语法、匹配规则与使用指南
在软件开发、数据处理和文本分析过程中,我们经常需要从大量文本中查找、验证、提取或者替换特定内容。
例如:
- 验证用户输入的手机号
- 检查邮箱地址格式
- 提取文本中的数字
- 查找日志中的错误信息
- 批量替换文本内容
- 提取URL、IP地址和订单编号
- 在代码编辑器中搜索特定代码
- 对用户提交的数据进行格式验证
如果使用普通字符串处理方法完成这些任务,代码往往比较复杂。
正则表达式(Regular Expression,简称 Regex 或 RegExp)就是专门用于描述文本匹配规则的一种工具。
通过一组简洁的符号,可以定义复杂的字符串匹配规则。
例如:
\d+
表示匹配一个或多个数字。
文本:
订单编号:A20260806,金额:199元
使用 \d+ 可以匹配:
20260806
199
正则表达式虽然刚开始看起来比较复杂,但掌握字符类、数量词、边界、分组等基础语法后,就可以解决大量实际开发问题。
什么是正则表达式?
正则表达式是一种用于描述字符串匹配规则的表达式。
英文名称是:
Regular Expression
简称:
Regex
在不同编程语言中,也经常写作:
Regex
RegExp
regular expression
正则表达式本身并不是一种编程语言,而是一套用于描述字符串模式的规则。
例如:
hello
可以匹配:
hello
hello world
say hello
如果需要匹配数字,可以使用:
\d+
如果需要匹配以 http 开头的地址,可以使用:
^http
因此,可以简单理解为:
正则表达式就是使用特殊符号描述“什么样的文本应该被匹配”。
正则表达式有什么用?
正则表达式最常见的用途包括文本搜索、数据验证、数据提取和文本替换。
1. 数据验证
例如验证:
- 手机号
- 邮箱
- 用户名
- 密码
- URL
- IP地址
- 日期
- 身份证号码
例如手机号:
^1[3-9]\d{9}$
2. 文本搜索
可以在大量文本中查找特定内容。
例如:
ERROR
WARN
INFO
可以通过正则表达式快速搜索日志中的错误信息。
3. 内容提取
例如:
订单编号:A20260806
通过:
[A-Z]\d+
可以提取:
A20260806
4. 文本替换
例如将:
2026-08-06
2026-08-07
2026-08-08
统一替换为其他日期格式。
5. 数据清洗
例如:
价格:¥199 元
通过:
\d+
可以提取:
199
正则表达式是如何工作的?
正则表达式通常可以理解为以下过程:
输入文本
↓
正则表达式
↓
正则匹配引擎
↓
查找匹配内容
↓
返回匹配结果
例如:
文本:
订单编号:A20260806
正则:
[A-Z]\d+
匹配过程:
[A-Z]
匹配一个大写字母:
A
然后:
\d+
继续匹配一个或多个数字:
20260806
最终得到:
A20260806
正则表达式基础语法
正则表达式由普通字符和特殊字符组成。
常见语法包括:
| 语法 | 含义 | |
|---|---|---|
a | 匹配字符 a | |
. | 匹配任意单个字符 | |
\d | 匹配数字 | |
\w | 匹配字母、数字、下划线 | |
\s | 匹配空白字符 | |
^ | 字符串开始 | |
$ | 字符串结束 | |
* | 0次或多次 | |
+ | 1次或多次 | |
? | 0次或1次 | |
{n} | 恰好匹配 n 次 | |
{n,m} | 匹配 n 到 m 次 | |
[] | 字符集合 | |
[^] | 否定字符集合 | |
() | 分组 | |
| ` | ` | 或条件 |
普通字符
普通字符通常可以直接进行匹配。
例如:
hello
可以匹配:
hello
文本:
hello world
其中:
hello
会被匹配。
如果正则表达式是:
abc
那么:
abc
可以匹配。
而:
abcd
也可能包含匹配内容:
abc
因此,如果希望整个字符串必须完全匹配,就需要使用边界。
例如:
^abc$
点号 .
. 是正则表达式中非常常用的特殊字符。
它通常表示:
匹配除换行符之外的任意单个字符
例如:
a.c
可以匹配:
abc
a1c
a-c
a c
因为 . 可以匹配中间的一个字符。
例如:
abc
匹配:
a.c
但是:
ac
通常无法匹配,因为中间缺少一个字符。
需要注意,不同正则引擎对换行符以及 DOTALL 模式的处理可能有所不同。
数字字符 \d
\d 用于匹配数字。
例如:
\d
可以匹配:
0
1
2
...
9
如果需要匹配连续数字:
\d+
例如:
订单号:20260806
可以匹配:
20260806
非数字 \D
\D 与 \d 相反。
表示:
匹配非数字字符
例如:
\D+
可以用于匹配:
abc
你好
¥
但不会匹配数字字符。
单词字符 \w
\w 通常用于匹配:
- 字母
- 数字
- 下划线
例如:
\w+
可以匹配:
hello
user123
user_name
需要注意,不同语言和正则引擎对 \w 的 Unicode 行为可能存在差异。
如果需要严格匹配中文、英文或特定 Unicode 字符,应根据具体语言的正则实现选择合适规则。
非单词字符 \W
\W 与 \w 相反。
表示:
匹配非单词字符
例如:
\W+
可以匹配:
@
-
.
空格
!
空白字符 \s
\s 用于匹配空白字符。
常见包括:
- 空格
- 制表符
- 换行符
例如:
\s+
可以匹配连续空格。
文本:
hello world
中间的空格可以被匹配。
非空白字符 \S
\S 与 \s 相反。
表示:
匹配非空白字符
例如:
\S+
可以匹配:
hello
world
123
字符集合 []
字符集合使用:
[]
表示匹配其中任意一个字符。
例如:
[abc]
可以匹配:
a
b
c
但不能匹配:
d
字符范围
字符集合支持范围。
例如:
[a-z]
表示:
a 到 z 的小写字母
数字:
[0-9]
大写字母:
[A-Z]
大小写字母:
[A-Za-z]
数字和字母:
[A-Za-z0-9]
否定字符集合 [^]
如果希望匹配“不属于某个集合”的字符,可以使用 [^...]。
例如:
[^0-9]
表示:
匹配非数字字符
例如:
abc123
使用:
[^0-9]+
可以匹配:
abc
数量词
数量词用于控制某个字符或表达式出现多少次。
常用数量词:
| 数量词 | 含义 |
|---|---|
* | 0次或多次 |
+ | 1次或多次 |
? | 0次或1次 |
{n} | 恰好 n 次 |
{n,} | 至少 n 次 |
{n,m} | n 到 m 次 |
*:0次或多次
例如:
ab*
可以匹配:
a
ab
abb
abbb
因为 b* 表示:
b可以出现0次或多次
+:1次或多次
例如:
ab+
可以匹配:
ab
abb
abbb
但不能匹配:
a
因为 + 至少需要出现一次。
?:0次或1次
例如:
colou?r
可以匹配:
color
colour
因为 u? 表示:
u可以出现0次或1次
{n}:固定次数
例如:
\d{4}
表示:
连续匹配4个数字
例如:
2026
可以匹配。
{n,m}:范围次数
例如:
\d{2,4}
表示:
匹配2到4个数字
可以匹配:
12
123
1234
{n,}:至少出现n次
例如:
\d{3,}
表示:
至少匹配3个数字
可以匹配:
123
1234
12345
字符串开始 ^
^ 通常用于表示字符串开始位置。
例如:
^http
可以匹配:
https://example.com
但:
visit https://example.com
如果 http 不在字符串开头,则不会匹配。
字符串结束 $
$ 通常表示字符串结束位置。
例如:
.com$
可以匹配:
example.com
如果字符串最后不是:
.com
则不会匹配。
完整匹配
如果希望整个字符串都符合规则,通常需要同时使用:
^
$
例如:
^\d{4}$
表示:
整个字符串必须刚好由4个数字组成。
可以匹配:
2026
不能完整匹配:
20260
也不能匹配:
abc2026
这是数据验证中非常重要的一种写法。
分组 ()
圆括号可以将多个字符组合成一个整体。
例如:
(abc)+
表示:
abc
abcabc
abcabcabc
也可以使用分组进行捕获。
例如:
(\d{4})-(\d{2})-(\d{2})
可以将:
2026-08-06
分成:
2026
08
06
这对于日期、订单号和日志信息提取非常有用。
或条件 |
| 表示“或者”。
例如:
java|python
表示匹配:
java
或者:
python
如果需要对多个条件进行分组,可以结合 ():
(java|python|go)
转义字符 \
正则表达式中有很多特殊字符。
例如:
.
*
+
?
(
)
[
]
{
}
^
$
如果希望匹配这些字符本身,需要使用反斜杠进行转义。
例如:
\.
表示匹配真正的:
.
匹配:
example.com
可以使用:
example\.com
常见转义字符
| 表达式 | 含义 |
|---|---|
\. | 匹配点号 |
\+ | 匹配加号 |
\? | 匹配问号 |
\* | 匹配星号 |
\( | 匹配左括号 |
\) | 匹配右括号 |
\\ | 匹配反斜杠 |
贪婪匹配与非贪婪匹配
这是正则表达式进阶使用中非常重要的概念。
默认情况下,很多正则量词是贪婪的。
例如:
<.*>
文本:
<div>Hello</div>
可能会尽可能多地匹配内容。
如果希望尽可能少地匹配,可以使用非贪婪量词:
<.*?>
这样通常可以匹配较短的内容。
常见非贪婪写法:
*?
+?
??
{n,m}?
贪婪匹配示例
文本:
<div>Hello</div><div>World</div>
使用:
<.*>
可能匹配整个:
<div>Hello</div><div>World</div>
如果使用:
<.*?>
则更倾向于逐个匹配:
<div>
</div>
<div>
</div>
实际结果还会受到具体正则引擎和模式设置影响。
捕获组与非捕获组
普通分组:
(\d+)
通常会创建捕获组。
如果只希望进行分组,而不需要保存捕获结果,可以使用:
(?:\d+)
这称为:
非捕获组
例如:
(?:https?|ftp)://
可以用于匹配:
http://
https://
ftp://
但不会额外创建捕获组。
正则断言
断言用于判断某个位置是否满足条件,而不会直接消耗对应字符。
常见断言包括:
(?=...)
(?!...)
(?<=...)
(?<!...)
正向先行断言
例如:
\d+(?=元)
表示:
匹配后面紧跟“元”的数字。
文本:
价格100元
数量20个
可以匹配:
100
但不会匹配:
20
因为 20 后面不是“元”。
负向先行断言
例如:
\d+(?!元)
表示匹配后面不是“元”的数字。
断言是高级正则功能,在复杂文本处理和数据提取中非常有用。
不同编程语言对后行断言的支持可能不同,因此实际开发时需要查看对应语言的正则引擎规则。
常见正则表达式示例
邮箱地址
一个常见的简单邮箱匹配规则:
^[\w.-]+@[\w.-]+\.\w+$
例如:
user@example.com
可以匹配。
需要注意:
邮箱格式实际标准非常复杂,简单正则通常只适合常见格式检查,不建议使用一个极其复杂的正则试图完整实现所有邮箱标准。
手机号验证
常见中国大陆手机号格式:
^1[3-9]\d{9}$
例如:
13800138000
可以匹配。
它的基本结构是:
1
+
3-9之间的一位数字
+
9位数字
总长度:
11位
实际业务系统中,如果手机号规则发生变化,应根据目标地区和业务要求进行调整。
身份证号码
常见的18位身份证格式可以使用:
^\d{17}[\dXx]$
结构:
17位数字
+
最后一位数字或X
需要注意:
这个正则只能检查基本格式,不能判断身份证号码是否真实有效。
如果需要进一步验证,还需要检查出生日期、地区编码以及校验码。
URL地址
简单判断HTTP和HTTPS:
^https?://
可以匹配:
http://example.com
以及:
https://example.com
如果需要完整验证URL,建议使用语言或平台提供的URL解析工具,而不是仅依赖复杂正则。
IPv4地址
简单的IPv4格式匹配:
^(\d{1,3}\.){3}\d{1,3}$
可以匹配:
192.168.1.1
但这个正则也可能匹配:
999.999.999.999
因此它只能检查基本结构。
如果需要严格验证IP地址,应进一步判断每一段是否在:
0-255
范围内。
日期格式验证
例如验证:
2026-08-06
可以使用:
^\d{4}-\d{2}-\d{2}$
但是需要注意:
2026-99-99
同样可能通过这个正则。
因此:
正则适合检查格式,不一定适合判断日期是否真实存在。
更可靠的做法是:
正则检查格式
↓
日期解析
↓
验证真实日期
用户名验证
例如要求:
- 只能使用字母
- 数字
- 下划线
- 长度4到20位
可以使用:
^[A-Za-z0-9_]{4,20}$
例如:
user_123
可以匹配。
密码格式验证
例如要求:
- 至少8位
- 包含大写字母
- 包含小写字母
- 包含数字
可以使用类似:
^(?=.*[A-Z])(?=.*[a-z])(?=.*\d).{8,}$
如果还要求特殊字符,可以增加相应规则。
不过密码安全不能只依赖正则表达式,还需要:
- 服务端验证
- 安全存储
- 密码哈希
- 登录限制
- 防暴力破解
- 多因素认证
提取文本中的数字
文本:
商品价格:199元,库存:50件
使用:
\d+
可以得到:
199
50
这是正则最常见的文本提取场景之一。
提取中文
在部分正则引擎中,可以使用 Unicode 属性:
\p{Script=Han}+
用于匹配汉字。
不过不同语言和正则引擎对 Unicode 属性支持不同。
在 JavaScript、Java、Python 等语言中,具体写法和支持情况需要根据运行环境确认。
提取HTML标签
简单情况下可以使用:
<[^>]+>
例如:
<div>Hello</div>
可以匹配:
<div>
和:
</div>
但是不建议使用正则完整解析复杂HTML。
因为HTML具有嵌套结构,复杂情况下应该使用HTML解析器。
正则表达式在表单验证中的应用
前端表单经常使用正则验证:
用户输入
↓
正则表达式
↓
格式检查
↓
提交服务器
例如邮箱:
^[\w.-]+@[\w.-]+\.\w+$
手机号:
^1[3-9]\d{9}$
用户名:
^[A-Za-z0-9_]{4,20}$
但是前端验证不能代替服务端验证。
正确做法应该是:
前端验证
↓
提高用户体验
↓
服务端再次验证
↓
业务处理
正则表达式在日志分析中的应用
服务器日志中经常包含:
2026-08-06 10:20:30 INFO user login success
2026-08-06 10:21:12 ERROR database connection failed
如果需要提取:
ERROR
可以使用:
ERROR
如果需要提取日期:
\d{4}-\d{2}-\d{2}
如果需要提取时间:
\d{2}:\d{2}:\d{2}
正则表达式非常适合日志分析和数据提取。
正则表达式在数据清洗中的应用
例如原始数据:
联系电话:13800138000
联系电话:13900139000
联系电话:15000150000
可以使用:
1[3-9]\d{9}
提取手机号。
又例如:
价格:¥100
价格:¥299
价格:¥599
可以使用:
\d+
提取数字。
正则表达式在代码编辑器中的应用
很多开发工具都支持正则搜索。
例如:
- Visual Studio Code
- IntelliJ IDEA
- Sublime Text
- Notepad++
- Vim
在代码编辑器中打开正则搜索后,可以使用:
^\s*
查找空行或行首空白。
也可以使用:
TODO|FIXME
快速查找代码中的待办标记。
Java中的正则表达式
Java通过 java.util.regex 提供正则表达式支持。
例如:
String regex = "\\d+";
boolean result = "123".matches(regex);
System.out.println(result);
输出:
true
需要特别注意:
Java字符串本身也使用反斜杠进行转义。
因此正则:
\d+
在Java字符串中通常需要写成:
"\\d+"
JavaScript中的正则表达式
JavaScript提供了 RegExp 对象和正则字面量。
例如:
const reg = /\d+/;
console.log(reg.test("123"));
结果:
true
也可以使用:
const reg = new RegExp("\\d+");
console.log(reg.test("123"));
JavaScript常用正则方法
test()
用于判断是否匹配:
const reg = /\d+/;
reg.test("123");
结果:
true
match()
例如:
const text = "订单123,订单456";
const result = text.match(/\d+/g);
console.log(result);
结果:
["123", "456"]
replace()
例如:
const text = "hello 123";
const result = text.replace(/\d+/g, "");
console.log(result);
结果:
hello
Python中的正则表达式
Python主要通过 re 模块处理正则表达式。
例如:
import re
result = re.findall(
r"\d+",
"abc123def456"
)
print(result)
输出:
['123', '456']
Python中经常使用原始字符串:
r"\d+"
这样可以减少反斜杠转义带来的问题。
Python常用正则方法
re.search()
查找第一个匹配:
import re
result = re.search(
r"\d+",
"abc123"
)
print(result.group())
输出:
123
re.findall()
查找所有匹配:
import re
result = re.findall(
r"\d+",
"abc123def456"
)
print(result)
输出:
['123', '456']
re.sub()
替换匹配内容:
import re
text = "hello123"
result = re.sub(
r"\d+",
"",
text
)
print(result)
结果:
hello
正则表达式常见问题
正则表达式难学吗?
正则表达式基础语法并不复杂。
建议按照下面的顺序学习:
普通字符
↓
字符类
↓
数量词
↓
边界
↓
分组
↓
或条件
↓
捕获
↓
断言
↓
高级匹配
掌握常用语法之后,大部分日常开发场景都可以解决。
为什么正则表达式看起来很复杂?
例如:
^(?=.*[A-Z])(?=.*[a-z])(?=.*\d).{8,}$
刚开始看可能比较难理解。
可以拆开:
^
字符串开始
(?=.*[A-Z])
必须存在大写字母
(?=.*[a-z])
必须存在小写字母
(?=.*\d)
必须存在数字
.{8,}
至少8个字符
$
字符串结束
因此:
复杂正则不要一次性阅读,应该拆成多个部分理解。
正则表达式中的灾难性回溯
复杂正则表达式可能产生严重的性能问题。
其中一种典型情况叫:
灾难性回溯(Catastrophic Backtracking)
例如某些具有大量嵌套重复结构的正则,在处理特殊输入时可能产生大量回溯。
可能造成:
- CPU占用升高
- 请求响应变慢
- 服务线程长时间占用
- 极端情况下造成拒绝服务风险
因此在处理用户可控输入时,需要特别注意正则性能。
如何优化正则表达式性能?
可以遵循以下原则。
1. 避免不必要的复杂嵌套
尽量不要随意使用:
(.*)+
或者类似高度嵌套的重复结构。
2. 尽量缩小匹配范围
例如:
.*
匹配范围非常大。
如果明确知道只能匹配数字,可以使用:
\d+
这样通常更加清晰,也有利于控制匹配范围。
3. 谨慎处理用户输入
如果正则表达式用于:
- API接口
- Web表单
- 日志服务
- 网络服务
应该考虑恶意输入导致的性能问题。
正则表达式常见错误
错误一:忘记使用边界
例如:
\d{11}
可能从更长的数字字符串中截取11位。
如果需要验证整个字符串,可以使用:
^\d{11}$
错误二:特殊字符没有转义
例如需要匹配:
example.com
不要简单写:
example.com
因为 . 在正则中代表任意字符。
更准确的是:
example\.com
错误三:把格式验证当成业务验证
例如:
^\d{4}-\d{2}-\d{2}$
只能检查:
2026-08-06
这种结构。
不能保证:
2026-99-99
一定是合法日期。
错误四:用正则解析复杂结构
正则适合处理:
- 文本
- 简单结构
- 固定格式
不适合直接替代:
- JSON解析器
- XML解析器
- HTML解析器
- 编程语言解析器
复杂结构应该使用对应的专业解析工具。
正则表达式学习建议
如果刚开始学习正则表达式,可以先掌握以下内容:
\d
\w
\s
[]
[^]
*
+
?
{}
^
$
()
|
然后学习:
捕获组
非捕获组
贪婪匹配
非贪婪匹配
先行断言
后行断言
Unicode
最后再学习:
正则性能
回溯
高级断言
复杂文本解析
不需要一开始就记住所有语法。
实际开发中,能够:
理解规则
+
编写规则
+
测试规则
+
优化规则
就已经能够解决绝大多数常见问题。
在线正则表达式测试工具
编写复杂正则时,推荐先使用在线工具进行测试。
在线正则工具通常可以帮助你:
- 输入测试文本
- 编写Regex
- 实时查看匹配结果
- 检查捕获组
- 测试替换结果
- 调试复杂表达式
如果需要快速测试正则表达式,可以使用本站的在线工具:
/tools/regex
使用流程:
输入正则表达式
↓
输入测试文本
↓
执行匹配
↓
查看匹配结果
↓
调整正则表达式
对于复杂表达式,建议准备多个正常数据和异常数据进行测试。
正则表达式测试示例
例如需要验证手机号:
正则:
^1[3-9]\d{9}$
测试:
13800138000
结果:
匹配
测试:
123456
结果:
不匹配
再测试:
138001380000
结果:
不匹配
通过多个测试数据,可以判断正则表达式是否符合实际业务需求。
常用正则表达式速查表
| 场景 | 正则表达式 | |
|---|---|---|
| 一个数字 | \d | |
| 多个数字 | \d+ | |
| 一个单词字符 | \w | |
| 多个单词字符 | \w+ | |
| 空白字符 | \s | |
| 任意字符 | . | |
| 数字范围 | [0-9] | |
| 小写字母 | [a-z] | |
| 大写字母 | [A-Z] | |
| 0次或多次 | * | |
| 1次或多次 | + | |
| 0次或1次 | ? | |
| 固定次数 | {n} | |
| 次数范围 | {n,m} | |
| 开始位置 | ^ | |
| 结束位置 | $ | |
| 分组 | () | |
| 或条件 | ` | ` |
| 非数字 | \D | |
| 非空白 | \S | |
| 非单词字符 | \W |
正则表达式与字符串处理的区别
很多开发者会问:
什么时候应该使用正则,什么时候直接使用字符串方法?
如果只是判断:
字符串是否包含某个固定内容
通常使用:
includes()
或者:
contains()
就可以。
如果需要:
复杂模式匹配
多个条件
批量提取
格式验证
批量替换
正则表达式会更加方便。
例如:
查找固定字符串
↓
字符串方法
复杂文本模式
↓
正则表达式
不要为了使用正则而使用正则。
简单问题使用简单方法通常更加容易维护。
正则表达式的优点
正则表达式最大的优点是:
1. 表达能力强
可以使用简短语法描述复杂文本规则。
2. 使用范围广
几乎所有主流编程语言都支持正则表达式。
3. 适合文本处理
非常适合:
- 搜索
- 验证
- 提取
- 替换
4. 开发效率高
很多复杂的字符串处理任务,通过一个正则表达式就可以完成。
正则表达式的缺点
正则表达式也存在一些不足。
1. 可读性较差
例如:
^(?=.*[A-Z])(?=.*[a-z])(?=.*\d).{8,}$
对于不了解正则的人来说并不容易理解。
2. 复杂正则不容易维护
随着业务规则增加,正则可能越来越复杂。
因此建议:
- 添加注释
- 拆分规则
- 编写测试
- 避免过度复杂
3. 不适合所有数据结构
对于JSON、XML、HTML等具有复杂结构的数据,应该优先使用专业解析器。
正则表达式最佳实践
在实际项目中使用正则表达式,可以遵循以下原则:
1. 优先保证可读性
不要为了缩短正则而让代码难以维护。
2. 添加注释
复杂正则应该说明每一部分的含义。
3. 使用测试数据
至少准备:
- 正常数据
- 边界数据
- 空数据
- 异常数据
- 恶意数据
4. 前后端都进行验证
前端验证主要用于提升用户体验。
真正的安全验证必须放在服务端。
5. 注意性能
处理大量文本或者用户输入时,需要关注正则回溯问题。
6. 不要滥用正则
能够使用简单字符串方法解决的问题,就没有必要使用复杂正则。
正则表达式FAQ
Regex和RegExp有什么区别?
Regex是:
Regular Expression
的简称。
RegExp通常表示:
Regular Expression对象或正则表达式
两者通常都与正则表达式有关。
正则表达式区分大小写吗?
是否区分大小写取决于正则表达式模式和具体实现。
例如JavaScript可以使用:
/hello/i
其中:
i
表示忽略大小写。
因此:
hello
HELLO
Hello
都可以匹配。
如何忽略大小写?
很多正则引擎都提供忽略大小写模式。
例如JavaScript:
/hello/i
Java:
Pattern.CASE_INSENSITIVE
不同语言写法不同。
正则表达式可以匹配中文吗?
可以。
简单情况下可以直接写:
你好
对于Unicode字符范围和复杂中文匹配,可以使用对应正则引擎支持的Unicode属性。
正则表达式可以验证密码吗?
可以验证密码的基本格式,例如:
- 长度
- 大写字母
- 小写字母
- 数字
- 特殊字符
但正则表达式不能解决密码安全的全部问题。
密码系统还需要:
- 安全哈希
- 加盐
- 登录限制
- 多因素认证
- 防暴力破解
总结
正则表达式是一种非常重要的文本处理技术。
它通过简单的规则描述复杂的字符串匹配模式,可以广泛应用于:
- 数据验证
- 文本搜索
- 数据提取
- 文本替换
- 日志分析
- 数据清洗
- 代码搜索
学习正则表达式时,建议首先掌握:
\d
\w
\s
[]
[^]
*
+
?
{}
^
$
()
|
然后进一步学习:
捕获组
非捕获组
贪婪与非贪婪
断言
Unicode
在实际开发中,还需要关注:
可读性
正确性
性能
安全性
可维护性
正则表达式并不是越复杂越好。
好的正则表达式应该做到:
能准确匹配目标内容,同时保持清晰、可维护,并且不会因为异常输入产生严重性能问题。
如果只是进行简单的字符串查找,应优先考虑普通字符串方法;如果需要进行复杂模式匹配、验证、提取和替换,那么正则表达式通常是非常高效的解决方案。