10.2 刷题知识点总结(1) ---- 正则表达式
核心概念与语法
正则表达式由普通字符(如字母、数字)和元字符(具有特殊含义的字符)组成。以下是常用元字符和语法:
1. 基础匹配
.
:匹配任意单个字符(除换行符\n
)- 例:
a.b
匹配 “acb”、“a1b”,不匹配 “ab”、“a\nb”
- 例:
[]
:匹配括号内的任意一个字符- 例:
[abc]
匹配 “a”、“b” 或 “c”;[0-9]
匹配任意数字
- 例:
[^]
:匹配不在括号内的任意字符(取反)- 例:
[^0-9]
匹配非数字字符
- 例:
|
:逻辑“或”,匹配两边的任意一个表达式- 例:
cat|dog
匹配 “cat” 或 “dog”
- 例:
2. 量词(匹配次数)
*
:匹配前面的元素 0 次或多次- 例:
a*
匹配 “”(空)、“a”、“aa”、“aaa” 等
- 例:
+
:匹配前面的元素 1 次或多次- 例:
a+
匹配 “a”、“aa”,不匹配 “”
- 例:
?
:匹配前面的元素 0 次或 1 次(可选)- 例:
a?
匹配 “” 或 “a”
- 例:
{n}
:匹配前面的元素 恰好 n 次- 例:
a{3}
仅匹配 “aaa”
- 例:
{n,}
:匹配前面的元素 至少 n 次- 例:
a{2,}
匹配 “aa”、“aaa” 等
- 例:
{n,m}
:匹配前面的元素 n 到 m 次(包含 n 和 m)- 例:
a{1,3}
匹配 “a”、“aa”、“aaa”
- 例:
3. 位置匹配(锚点)
^
:匹配字符串的开头- 例:
^abc
匹配以 “abc” 开头的字符串(如 “abcd”)
- 例:
$
:匹配字符串的结尾- 例:
xyz$
匹配以 “xyz” 结尾的字符串(如 “axyz”)
- 例:
\b
:匹配单词边界(单词与非单词字符的位置)- 例:
\bcat\b
匹配独立的 “cat”,不匹配 “category” 中的 “cat”
- 例:
4. 转义字符
如果需要匹配元字符本身(如 .
、*
、(
等),需用 \
转义:
- 例:
a\.b
匹配 “a.b”(而非 “acb”);\*
匹配 “*”
5. 预定义字符集
\d
:匹配任意数字(等价于[0-9]
)\D
:匹配非数字(等价于[^0-9]
)\w
:匹配字母、数字、下划线(等价于[a-z A-Z 0-9 _]
)\W
:匹配非单词字符(等价于[^ a-z A-Z 0-9 _]
)\s
:匹配空白字符(空格、制表符\t
、换行符\n
等)\S
:匹配非空白字符
常用示例
-
验证手机号(中国大陆):
^1[3-9]\d{9}$
- 以 “1” 开头,第二位是 3-9,后面跟 9 位数字。
-
验证邮箱:
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
- 匹配类似 “user@example.com” 的邮箱格式。
-
提取 HTML 标签中的内容:
<title>(.*?)</title>
- 用括号
()
定义分组,.*?
非贪婪匹配标签内的内容。
- 用括号
-
替换字符串中的空格:
用\s+
匹配一个或多个空格,替换为单个空格:
"hello world".replaceAll("\\s+", " ")
输出结果:
"hello world"
注意事项
- 贪婪匹配 vs 非贪婪匹配:默认是贪婪模式(尽可能多匹配),加
?
切换为非贪婪模式(尽可能少匹配)。
例:a.*b
匹配 “aabxb” 中的 “aabxb”,而a.*?b
匹配 “aab”。 - 不同语言的细微差异:Java 中需用双反斜杠
\\
(如\\d
),而 Python、JavaScript 中用单反斜杠\
(如\d
)。 - 性能问题:复杂的正则表达式可能效率较低,避免过度嵌套或不必要的贪婪匹配。