在正则表达式中,特殊字符(也称为元字符)是具有特殊含义的字符,用于定义匹配规则。它们与普通字符(如字母、数字)不同,需要通过转义(通常加反斜杠 \
)来表示其字面意义。以下是正则表达式中常见的特殊字符及其用法:
一、基础特殊字符
字符 |
含义 |
示例 |
. |
匹配任意单个字符(除换行符 \n ,除非启用 DOTALL 模式)。 |
a.c → “abc”, “a1c”, “a c” |
^ |
匹配字符串的开头(或在字符组 [] 内表示否定)。 |
^Hello → 以 “Hello” 开头的字符串 |
$ |
匹配字符串的结尾。 |
world$ → 以 “world” 结尾的字符串 |
* |
匹配前面的元素0次或多次。 |
ab*c → “ac”, “abc”, “abbc” |
+ |
匹配前面的元素1次或多次。 |
go+l → “gol”, “gool”, “gooool” |
? |
匹配前面的元素0次或1次(或表示非贪婪模式的修饰符)。 |
colou?r → “color” 或 “colour” |
` |
` |
表示逻辑或(匹配左边或右边的表达式)。 |
二、字符组(Character Classes)
字符 |
含义 |
示例 |
[ ] |
匹配括号内的任意一个字符。 |
[abc] → “a”, “b”, 或 “c” |
[^ ] |
匹配不在括号内的任意一个字符(否定字符组)。 |
[^0-9] → 非数字字符 |
[a-z] |
匹配小写字母范围(可组合使用)。 |
[a-zA-Z0-9] → 字母或数字 |
\d |
匹配数字(等价于 [0-9] )。 |
\d{3} → “123”, “456” |
\D |
匹配非数字(等价于 [^0-9] )。 |
\D+ → “abc”, “!@#” |
\w |
匹配单词字符(字母、数字、下划线,等价于 [a-zA-Z0-9_] )。 |
\w+ → “Java”, “hello_123” |
\W |
匹配非单词字符(等价于 [^\w] )。 |
\W+ → " ", “-”, “@” |
\s |
匹配空白字符(空格、制表符 \t 、换行符 \n 等)。 |
\s+ → " \t\n" |
\S |
匹配非空白字符(等价于 [^\s] )。 |
\S+ → “Hello”, “123” |
三、量词(Quantifiers)
字符 |
含义 |
示例 |
{n} |
匹配前面的元素恰好 n 次。 |
\d{4} → “2023” |
{n,} |
匹配前面的元素至少 n 次。 |
\d{2,} → “10”, “123”, “1000” |
{n,m} |
匹配前面的元素至少 n 次,最多 m 次。 |
\d{2,4} → “12”, “123”, “1234” |
* |
等价于 {0,} (0次或多次)。 |
ab*c → “ac”, “abc”, “abbc” |
+ |
等价于 {1,} (1次或多次)。 |
go+l → “gol”, “gool” |
? |
等价于 {0,1} (0次或1次)。 |
colou?r → “color” 或 “colour” |
四、边界匹配(Anchors)
字符 |
含义 |
示例 |
^ |
匹配字符串的开头(或在多行模式下匹配行的开头)。 |
^Hello → “Hello…” |
$ |
匹配字符串的结尾(或在多行模式下匹配行的结尾)。 |
world$ → “…world” |
\b |
匹配单词边界(即单词与非单词字符之间的位置)。 |
\bcat\b → “cat”(不匹配 “category”) |
\B |
匹配非单词边界。 |
\Bcat\B → “scatter” 中的 “cat” |
五、分组与引用
字符 |
含义 |
示例 |
( ) |
捕获分组:将多个字符视为一个单元,并记住匹配的文本(可通过 \1 , \2 引用)。 |
(ab)+ → “ab”, “abab” |
(?: ) |
非捕获分组:分组但不记住匹配的文本(性能更高)。 |
(?:ab)+ → 同上,但不捕获分组 |
\n |
引用第 n 个捕获分组(n 为 1-9 的数字)。 |
(\d)\1 → “11”, “22”(匹配重复数字) |
六、转义字符
如果需要匹配特殊字符本身的字面值(而非其特殊含义),需用反斜杠 \
转义:
字符 |
转义后含义 |
示例 |
\. |
匹配字面意义的点号 . |
192\.168\.1\.1 → “192.168.1.1” |
\\ |
匹配字面意义的反斜杠 \ |
C:\\Users\\ → “C:\Users” |
\* |
匹配字面意义的星号 * |
a\*b → “a*b” |
七、高级特殊字符
字符 |
含义 |
示例 |
?= |
正向预查:匹配后面跟着指定模式的字符串(不消耗字符)。 |
foo(?=bar) → “foobar” 中的 “foo” |
?! |
负向预查:匹配后面不跟着指定模式的字符串。 |
foo(?!bar) → “foobaz” 中的 “foo” |
?<= |
正向回顾后发:匹配前面是指定模式的字符串(不消耗字符)。 |
(?<=foo)bar → “foobar” 中的 “bar” |
?<! |
负向回顾后发:匹配前面不是指定模式的字符串。 |
(?<!foo)bar → “hellobar” 中的 “bar” |
八、常见正则表达式示例
- 匹配邮箱地址:
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
- 匹配URL:
https?://(?:www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b(?:[-a-zA-Z0-9()@:%_\+.~#?&
- 匹配手机号(中国):
^1[3-9]\d{9}$
- 提取HTML标签:
<([a-z]+)([^<]+)*(?:>(.*?)<\/\1>|\s+\/>)
总结
- 特殊字符是正则表达式的核心,通过组合它们可以构建复杂的匹配规则。
- 转义是关键:若需匹配字面意义的特殊字符(如
.
、*
),需用 \
转义。
- 分组与引用可用于提取或重复匹配子模式。
- 预查和回顾后发用于更精确的上下文匹配(如“匹配后面跟着X的Y”)。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
评论(0)