菜单

Q
发布于 2025-07-16 / 5 阅读
0
0

正则表达式:文本处理的瑞士军刀

你是否经常需要从大量文本中查找、替换特定的模式?或者想验证用户输入是否符合特定格式,比如邮箱地址或电话号码?如果答案是肯定的,那么正则表达式(Regular Expression,简称 Regex 或 Regexp)就是你一直在寻找的“瑞士军刀”!


一、什么是正则表达式? 🤔

简单来说,正则表达式就是用一系列特殊字符组成的字符串,来描述一种或多种字符串的模式

你可以把它想象成一个高级的搜索过滤器。当你使用 Ctrl+F 查找某个单词时,你是在查找精确匹配。而正则表达式则允许你查找符合某种规则的文本。例如:

  • 查找所有以“go”开头的单词。

  • 查找所有包含数字的行。

  • 查找所有有效的电子邮件地址格式。


二、为什么学习正则表达式? 💪

  1. 文本搜索与替换: 在代码编辑器、文本处理工具(如 Notepad++、VS Code)、命令行工具(如 grepsed)中进行高级查找和替换。

  2. 数据验证: 验证用户输入(如表单字段),确保数据格式正确。

  3. 数据提取: 从非结构化文本中提取特定信息。

  4. 编程: 几乎所有主流编程语言(JavaScript, Python, Java, Go, PHP, Ruby 等)都内置了对正则表达式的支持。


三、正则表达式基础语法 🧱

正则表达式由普通字符(字面量)和特殊字符(元字符)组成。

1. 字面量字符(Literal Characters)

大多数字符都按照字面意思匹配自身。

  • a, b, c 匹配字母 'a', 'b', 'c'。

  • 1, 2, 3 匹配数字 '1', '2', '3'。

  • Hello 匹配字符串 "Hello"。

2. 元字符(Metacharacters)

元字符赋予正则表达式特殊能力,它们不匹配自身,而是具有特殊含义。

元字符

含义

示例

匹配

.

匹配除换行符(\n)之外的任何单个字符。

a.c

abc, adc, aXc

[]

字符集:匹配方括号内列出的任何一个字符。

[aeiou]

任何一个元音字母

[0-9]

任何一个数字(等价于 \d

[a-zA-Z]

任何一个英文字母(大小写)

[^]

否定字符集:匹配不在方括号内列出的任何字符。

[^0-9][^\d]

任何一个非数字字符

**`

`**

或(OR):匹配 `

` 符号左边或右边的表达式。

()

分组/捕获组:将多个字符组合成一个单元。

(ab)+

ab, abab, ababab


四、常用特殊字符(预定义字符类) ✨

这些字符类是元字符的快捷方式,让你的正则表达式更简洁。

字符类

含义

示例

匹配

\d

匹配任何一个数字字符(等价于 [0-9])。

\d{3}

三个连续的数字

\D

匹配任何一个非数字字符(等价于 [^0-9])。

\D

任何非数字字符

\w

匹配任何一个单词字符(字母、数字或下划线,等价于 [a-zA-Z0-9_])。

\w+

一个或多个单词字符

\W

匹配任何一个非单词字符(等价于 [^\w])。

\W

任何非单词字符

\s

匹配任何空白字符(空格、制表符 \t、换行符 \n、回车符 \r 等)。

\s

一个空白字符

\S

匹配任何非空白字符

\S+

一个或多个非空白字符


五、量词(Quantifiers)📏

量词决定了它前面的字符或组应该出现多少次。

量词

含义

示例

匹配

*

匹配前面的元素零次或多次0 或更多次)。

a*b

b, ab, aab

+

匹配前面的元素一次或多次1 或更多次)。

a+b

ab, aab (不匹配 b)

?

匹配前面的元素零次或一次01 次,可选)。

colou?r

color, colour

{n}

匹配前面的元素恰好 n

\d{4}

恰好四个数字

{n,}

匹配前面的元素至少 n

a{2,}

aa, aaa

{n,m}

匹配前面的元素至少 n 次,但不超过 m

\d{3,5}

三到五个数字


六、锚点(Anchors)⚓

锚点不匹配任何字符,而是匹配字符串中的特定位置。

锚点

含义

示例

匹配

^

匹配字符串的开始。如果设置了多行模式(m 标志),则匹配行的开始。

^Hello

匹配以 "Hello" 开头的字符串或行

$

匹配字符串的结束。如果设置了多行模式(m 标志),则匹配行的结束。

world$

匹配以 "world" 结尾的字符串或行

\b

单词边界:匹配单词字符和非单词字符之间的位置。

\bcat\b

只匹配独立的 "cat" 单词,不匹配 "catapult" 或 "tomcat"

\B

非单词边界:匹配不在单词边界处的字符。

\Bcat\B

匹配 "tomcat" 中的 "cat"


七、标志(Flags)🚩

标志是放在正则表达式斜杠 / 之外的字符,用于改变匹配行为。

标志

含义

示例

作用

g

全局匹配(Global):查找所有匹配,而不是在找到第一个后停止。

/pattern/g

查找所有符合模式的子串

i

不区分大小写(Case-insensitive):匹配时不考虑大小写。

/abc/i

匹配 "abc", "Abc", "ABC"

m

多行匹配(Multiline):使 ^$ 匹配行的开头和结尾,而不仅仅是整个字符串的开头和结尾。

/^start/m

匹配每行的开头

s

dotAll 模式(Single line):使 . 匹配包括换行符在内的任何字符。

/a.b/s

匹配 "a\nb"

u

Unicode 模式:启用完整的 Unicode 支持,例如处理代理对。

/😂/u

正确匹配 Emoji

y

粘性匹配(Sticky):只从正则表达式的 lastIndex 属性指定的位置开始匹配。

/pattern/y

严格从指定位置匹配


八、实战演练:常见场景应用 🎯

现在,让我们通过一些实际例子来巩固所学知识。

1. 验证电子邮件地址

一个简单的邮箱验证(实际的邮箱格式非常复杂,这只是一个简化版):

代码段

^\w+([.-]?\w+)*@\w+([.-]?\w+)*(\.\w{2,3})+$
  • ^: 字符串开头。

  • \w+: 一个或多个单词字符(用户名部分)。

  • ([.-]?\w+)*: 可选的 .- 后面跟单词字符,重复零次或多次(用户名中的点、杠)。

  • @: 匹配 @ 符号。

  • \w+([.-]?\w+)*: 域名部分,与用户名类似。

  • (\.\w{2,3})+: 匹配顶级域名,如 .com, .cn 等,至少两个最多三个字母,且至少出现一次。

  • $: 字符串结尾。

2. 查找 HTML 标签

查找所有 <h1><h6> 标签:

代码段

<h[1-6]>.*?</h[1-6]>
  • <h[1-6]>: 匹配 <h 后跟一个 1 到 6 的数字,再跟 >

  • .*?: . 匹配任何字符,* 匹配零次或多次,? 使其非贪婪匹配(尽可能少地匹配),直到找到下一个模式。

  • </h[1-6]>: 匹配对应的结束标签。

3. 提取数字

从字符串中提取所有连续的数字:

JavaScript

const text = "订单号:12345,金额:99.99元,电话:13812345678。";
const numbers = text.match(/\d+/g);
console.log(numbers); // 输出: ["12345", "99", "99", "13812345678"]
  • \d+: 匹配一个或多个数字。

  • g: 全局匹配,找到所有符合的数字串。

用正则表达式解决字符串类型的算法题简直就是降维打击


评论