正则表达式语法
一、字符匹配
| 语法 | 描述 | 示例 |
|---|---|---|
普通字符 |
匹配自身 | abc 匹配字符串 "abc" |
. |
点号:匹配除换行符外的任意一个字符。 | a.c 匹配 "abc", "aac", "a-c"等 |
[...] |
字符组:匹配方括号内的任意一个字符。 | [aeiou] 匹配任意一个元音字母 |
[^...] |
排除型字符组:匹配不在方括号内的任意一个字符。 | [^0-9] 匹配任意一个非数字字符 |
\d |
匹配一个数字字符。等价于 [0-9]。 |
\d\d 匹配 "12", "05" 等两个连续数字 |
\D |
匹配一个非数字字符。等价于 [^0-9]。 |
\D\D 匹配 "ab", "#@" 等两个连续非数字 |
\w |
匹配一个单词字符(字母、数字、下划线)。等价于 [A-Za-z0-9_]。 |
\w+ 匹配一个或多个单词字符,如 "hello", "user123" |
\W |
匹配一个非单词字符。等价于 [^A-Za-z0-9_]。 |
\W 匹配 "@", "!", " " 等 |
\s |
匹配一个空白字符(包括空格、制表符 \t、换行符 \n、回车符 \r 等)。 |
a\sb 匹配 "a b"(中间有空格或制表符等) |
\S |
匹配一个非空白字符。 | \S\S 匹配 "ab", "12" 等两个连续非空白字符 |
二、量词(指定数量)
量词用于指定前面的元素(字符、组等)出现的次数。
| 语法 | 描述 | 示例 |
|---|---|---|
* |
匹配前面的元素零次或多次(尽可能多)。 | ab*c 匹配 "ac", "abc", "abbc", "abbbbc"等 |
+ |
匹配前面的元素一次或多次(尽可能多)。 | ab+c 匹配 "abc", "abbc",但不匹配 "ac" |
? |
匹配前面的元素零次或一次。 | colou?r 匹配 "color" 和 "colour" |
{n} |
匹配前面的元素恰好 n 次。 | a{3} 匹配 "aaa" |
{n,} |
匹配前面的元素至少 n 次(尽可能多)。 | a{2,} 匹配 "aa", "aaa", "aaaa" 等 |
{n,m} |
匹配前面的元素至少 n 次,至多 m 次(尽可能多)。 | a{2,4} 匹配 "aa", "aaa", "aaaa" |
默认是“贪婪”匹配,即尽可能多地匹配字符。在量词后面加上 ? 可以改为非贪婪(或懒惰)匹配,即尽可能少地匹配。
-
贪婪模式:
<.*>匹配"<div>hello</div>"中的整个字符串"<div>hello</div>"。 -
非贪婪模式:
<.*?>匹配"<div>hello</div>"中的"<div>"和"</div>"两个标签。
三、位置锚点(边界)
| 语法 | 描述 | 示例 |
|---|---|---|
^ |
开始位置:匹配字符串的开头(或一行的开头,在多行模式下)。 | ^Hello 匹配以 "Hello" 开头的字符串 |
$ |
结束位置:匹配字符串的结尾(或一行的结尾,在多行模式下)。 | world!$ 匹配以 "world!" 结尾的字符串 |
\b |
单词边界:匹配一个单词的开始或结束。 | \bcat\b 匹配 "a cat" 中的 "cat",但不匹配 "category" 或 "scatter" 中的 "cat" |
\B |
非单词边界:匹配不在单词边界的位置。 | \Bcat\B 匹配 "category" 中的 "cat",但不匹配独立的 "cat" |
四、分组与捕获
| 语法 | 描述 | 示例 | ||
|---|---|---|---|---|
(...) |
捕获分组:将多个元素组合在一起,并捕获匹配的文本供后续使用(反向引用)或提取。 | (ab)+ 匹配 "ababab" |
||
(?:...) |
非捕获分组:只分组,不捕获匹配的文本。效率更高,当你不需要引用匹配内容时使用。 | (?:ab)+ 匹配 "ababab",但不会捕获内容 |
||
| `(a | b)` | 多选结构(或):匹配 a 或 b。 |
`(gray | grey)` 匹配 "gray" 或 "grey" |
\n |
反向引用:引用第 n 个捕获分组匹配到的文本(n 是数字)。 | (\w+) \1 匹配 "hello hello" 或 "bye bye"(重复的单词) |
五、零宽断言(Lookaround)
这是一种更高级的锚点,它匹配的是一个位置,而不是字符本身。
| 语法 | 名称 | 描述 | 示例 | |
|---|---|---|---|---|
(?=...) |
正向先行断言 | 匹配后面是 ... 的位置 |
`Windows(?=10 | 11)` 匹配 "Windows" 仅当其后紧跟 "10" 或 "11" |
(?!...) |
负向先行断言 | 匹配后面不是 ... 的位置 |
`Windows(?!95 | 98)` 匹配 "Windows" 仅当其后紧跟的不是 "95" 或 "98" |
(?<=...) |
正向后行断言 | 匹配前面是 ... 的位置(注意模式在左侧) |
(?<=\$)\d+ 匹配数字 仅当其前面有一个 $ 符号,如 "$100" 中的 "100" |
|
(?<!...) |
负向后行断言 | 匹配前面不是 ... 的位置 |
(?<!\$)\d+ 匹配数字 仅当其前面没有 $ 符号,如 "100" 中的 "100" |
六、修饰符(Flags)
修饰符可以改变正则表达式的匹配行为,通常放在表达式结束符之后(如 /pattern/g)。
| 修饰符 | 描述 | 示例 |
|---|---|---|
i |
忽略大小写 (case-Insensitive) | /hello/i 可以匹配 "hello", "HELLO", "Hello" |
g |
全局匹配 (Global),找到所有匹配,而不是在第一个匹配后停止。 | |
m |
多行模式 (Multiline),使 ^ 和 $ 匹配每一行的开头和结尾,而不仅仅是整个字符串的开头和结尾。 |
|
s |
(单行模式) 使点号 . 匹配包括换行符在内的所有字符。 (在JavaScript中可用,其他语言可能不同) |
实战示例
-
匹配邮箱地址(简易版):
[\w.-]+@[\w.-]+\.\w+-
[\w.-]+:匹配用户名部分(字母、数字、点、减号) -
@:匹配 @ 符号 -
[\w.-]+:匹配域名(如 gmail, outlook) -
\.:匹配真正的点号 -
\w+:匹配顶级域名(com, org, net等)
-
-
匹配URL(简易版):
https?://[^\s/$.?#].[^\s]*-
https?:匹配 "http" 或 "https" -
://:匹配 :// -
[^\s/$.?#]:匹配一个非空白、非特殊字符(域名开头) -
[^\s]*:匹配后续的路径等所有非空白字符
-
-
匹配日期(YYYY-MM-DD):
\d{4}-\d{2}-\d{2}
学习建议与工具
-
循序渐进:从简单的字符匹配和量词开始,逐步学习分组、断言等高级特性。
-
多练习:理论看完后,一定要动手写、动手测试。
-
使用在线工具:
-
Regex101 (https://regex101.com/):功能强大,有解释、测试和调试功能,支持多种语言(PHP, JavaScript, Python等)。
-
-
注意语言差异:不同编程语言(Python, JavaScript, Java, PHP等)对正则表达式的实现略有差异,使用时请查阅相关文档。
正则表达式是一把瑞士军刀,初学可能觉得复杂,但一旦掌握,处理文本的效率会极大提升。祝你学习顺利!
浙公网安备 33010602011771号