正则表达式语法

一、字符匹配

语法 描述 示例
普通字符 匹配自身 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中可用,其他语言可能不同)  

实战示例

  1. 匹配邮箱地址(简易版):
    [\w.-]+@[\w.-]+\.\w+

    • [\w.-]+:匹配用户名部分(字母、数字、点、减号)

    • @:匹配 @ 符号

    • [\w.-]+:匹配域名(如 gmail, outlook)

    • \.:匹配真正的点号

    • \w+:匹配顶级域名(com, org, net等)

  2. 匹配URL(简易版):
    https?://[^\s/$.?#].[^\s]*

    • https?:匹配 "http" 或 "https"

    • ://:匹配 ://

    • [^\s/$.?#]:匹配一个非空白、非特殊字符(域名开头)

    • [^\s]*:匹配后续的路径等所有非空白字符

  3. 匹配日期(YYYY-MM-DD)
    \d{4}-\d{2}-\d{2}

学习建议与工具

  1. 循序渐进:从简单的字符匹配和量词开始,逐步学习分组、断言等高级特性。

  2. 多练习:理论看完后,一定要动手写、动手测试。

  3. 使用在线工具

  4. 注意语言差异:不同编程语言(Python, JavaScript, Java, PHP等)对正则表达式的实现略有差异,使用时请查阅相关文档。

正则表达式是一把瑞士军刀,初学可能觉得复杂,但一旦掌握,处理文本的效率会极大提升。祝你学习顺利!

posted @ 2025-08-25 10:02  卖雨伞的小男孩  阅读(28)  评论(0)    收藏  举报