正则表达式(Regular Expression,常简写为 regex、regexp 或 RE)是计算机科学中的一个概念。简单来说,它就像是一套**描述文本模式的“公式”或“模板”**。通过特定的字符和符号组合,它可以用来定义一个规则,从而在大量的文本中精准地查找、匹配、替换或提取出符合该规则的字符串。 凭借这套强大的模式匹配逻辑,正则表达式在计算机领域有着极其广泛的应用,主要包括以下几个方面: * **表单验证与数据校验** 🛡️ 在前端网页或后端应用中,用来检查用户输入的数据是否符合特定格式。例如,验证输入的手机号、电子邮箱地址、身份证号、密码强度以及 URL 链接的合法性等。 * **文本搜索与提取(爬虫与日志分析)** 🔍 这是开发者和数据分析师的高频应用场景。比如在编写网络爬虫时,从杂乱的 HTML 源码中提取出所有的超链接、图片地址或特定的文章内容;或者在服务器海量的日志文件中,快速筛选出包含特定错误代码、IP 地址或时间戳的记录。 * **文本替换与数据清洗** 🧹 可以批量且精准地修改文档内容。例如,将一篇长文档中所有符合某种格式的日期(如 `2026/05/20`)统一替换成另一种格式(如 `2026-05-20`),或者过滤掉文本中多余的空格、换行符及非法特殊字符,实现数据的标准化清洗。 * **编程开发与代码解析** 💻 程序员在日常开发中离不开它。现代代码编辑器利用正则表达式来实现代码的语法高亮显示;开发者可以使用它在庞大的项目代码库中,快速搜索特定的函数名、变量名,或进行大规模的代码重构与批量修改。 * **命令行操作与系统管理** ⚙️ 在 Linux/Unix 等系统的命令行环境中,许多强大的文本处理工具(如 `grep`、`sed`)都深度支持正则表达式。系统管理员可以利用它来高效地完成文件内容的检索、批量重命名文件以及自动化脚本中的文本处理任务。 * **网络安全与数据库操作** 🌐 在网络安全领域,正则表达式常用于识别网络流量中的恶意攻击特征或异常行为模式;在数据库中,则可以通过正则查询来过滤和检索符合特定复杂条件的非结构化数据。 --- 正则表达式最核心的魅力就在于它灵活多样的匹配方式。在 Excel 的 `REGEXEXTRACT`、`REGEXREPLACE` 以及文本判断函数(你提到的 `REGEXTEXT` 应该是 **`REGEXTEST`**)中,我们主要通过以下几种逻辑来实现精准的数据处理: ### 1. 基础字符与元字符匹配 这是最基本的匹配方式。**普通字符**直接匹配自身(如输入 `abc` 就找 abc),而**元字符**则代表一类字符。 * `\d`:匹配任意数字(等同于 `[0-9]`)。 * `\w`:匹配字母、数字或下划线(等同于 `[a-zA-Z0-9_]`)。 * `.` :匹配除换行符外的任意单个字符。 **Excel 演示:** 假设 A1 单元格内容为 `"订单号:AB20240520"` * **提取 (`REGEXEXTRACT`)**:`=REGEXEXTRACT(A1, "\d+")` * 结果会提取出连续的多个数字:`20240520`。 * **替换 (`REGEXREPLACE`)**:`=REGEXREPLACE(A1, ":", "-")` * 将冒号替换为横杠,结果为:`订单号-AB20240520`。 ### 2. 量词匹配(控制匹配的次数) 量词用来指定前面的字符需要出现多少次才能被匹配到。 * `+`:匹配前一个元素 1 次或多次(至少有一个)。 * `*`:匹配前一个元素 0 次或多次(有没有都行)。 * `?`:匹配前一个元素 0 次或 1 次(最多有一个)。 * `{n,m}`:匹配前一个元素 n 到 m 次。 **Excel 演示:** 假设 A1 单元格包含一段杂乱文本 `"价格分别是100元、25.5元和8元"` * **提取 (`REGEXEXTRACT`)**:`=REGEXEXTRACT(A1, "\d+\.?\d*", 1)` * 这里 `\d+` 匹配整数部分,`\.?` 匹配可能有的小数点,`\d*` 匹配可能有的小数部分。设置第三参数为 `1` 可以提取所有符合条件的结果。 * 结果会返回数组:`{100; 25.5; 8}`。 ### 3. 贪婪与非贪婪匹配(决定匹配的“胃口”) 默认情况下,正则表达式是**贪婪**的,它会尽可能多地匹配字符;而在量词后加上 `?` 则会变成**非贪婪(懒惰)**模式,尽可能少地匹配。 **Excel 演示:** 假设 A1 单元格内容为 `"标题正文"` * **贪婪匹配**:`=REGEXREPLACE(A1, "<.*>", "")` * `.*` 会从第一个 `<` 一直匹配到最后一个 `>`,导致整段文字都被删掉,结果为空。 * **非贪婪匹配**:`=REGEXREPLACE(A1, "<.*?>", "")` * `.*?` 遇到第一个 `>` 就会停止匹配。这样会分别删除 ``、`` 等标签。 * 结果为:`标题正文`。 ### 4. 分组与反向引用(提取特定部分并重组) 使用小括号 `()` 将一部分正则包裹起来形成一个“组”,在替换时可以通过 `$1`、`$2` 来引用这些组里的内容,实现灵活的文本重组。 **Excel 演示:** 假设 A1 单元格是手机号 `"13800138000"`,想把它脱敏并分段显示。 * **替换 (`REGEXREPLACE`)**:`=REGEXREPLACE(A1, "(\d{3})(\d{4})(\d{4})", "$1****$3")` * 我们将手机号分成了三组:前3位、中间4位、后4位。 * 替换文本中使用 `$1`(第一组)和 `$3`(第三组),中间加上星号。 * 结果为:`138****8000`。 ### 5. 边界与定位匹配(精准锁定位置) 这类匹配不占用字符长度,只检测位置是否符合要求。 * `^`:匹配字符串的开头。 * `$`:匹配字符串的结尾。 * `\b`:匹配单词的边界(比如独立的一个单词,而不是长单词的一部分)。 **Excel 演示:** 假设我们要判断 A1 单元格 `"ABC-12345"` 是否是以字母开头的标准格式。 * **判断 (`REGEXTEST`)**:`=REGEXTEST(A1, "^[A-Z]+-\d+$")` * `^` 和 `$` 确保了从头到尾完全符合“大写字母+横杠+数字”的规则。 * 如果符合返回 `TRUE`,否则返回 `FALSE`。 --- 💡 **特别提醒**: 1. 在 Excel 的这些新正则函数中,如果你要匹配反斜杠本身(例如匹配 `\d` 这个字面意思),通常需要双写转义,写成 `\\d`。 2. `REGEXEXTRACT` 提取出来的结果默认是**文本格式**。如果你提取的是数字并想要进行求和计算,记得在公式后面乘以 1 或者用 `VALUE()` 函数将其转换为数值格式。 你可以打开 Excel 试着把上面的例子敲进去玩一玩,实际感受一下它们的变化!如果有具体的表格数据想处理,也可以发给我,我帮你写对应的公式。 --- 在 Linux 系统中,正则表达式是处理文本的绝对核心。它通常结合经典的“三剑客”命令(`grep`、`sed`、`awk`)来发挥强大的威力。 在 Linux 中,正则主要分为**基础正则(BRE)**和**扩展正则(ERE)**。为了方便使用高级量词(如 `+`, `?`, `{}`),我们在实际工作中通常会使用 `grep -E`(等同于 `egrep`)或者 `sed -E` 来直接启用扩展正则。 下面结合你刚才熟悉的几种匹配方式,来看看它们在 Linux 命令行中是如何应用的: ### 1. 基础字符与元字符匹配 最常用的就是字符集合 `[]` 和预定义的范围,比如 `[0-9]` 或 `\d`(部分工具支持)。 * **场景**:在一个配置文件中,找出所有以数字开头的行。 * **命令 (`grep`)**: ```bash grep "^[0-9]" config.txt ``` *解析:`^` 锚定行首,`[0-9]` 匹配任意一个数字。* ### 2. 量词匹配(控制次数) 在扩展正则(`grep -E`)中,我们可以直接使用 `+`(至少一次)、`?`(零次或一次)以及 `{n,m}`。 * **场景**:查找日志文件中连续出现 3 到 5 次的数字串(比如特定的错误代码)。 * **命令 (`grep`)**: ```bash grep -E "[0-9]{3,5}" error.log ``` *解析:`{3,5}` 精确限定了前面的数字字符必须连续出现 3 到 5 次。* ### 3. 贪婪与非贪婪匹配 Linux 默认的 `grep` 和 `sed` 都是**贪婪匹配**的。如果想要实现非贪婪(即遇到第一个符合条件的就停止),通常需要开启 Perl 兼容模式(`grep -P`)。 * **场景**:提取 HTML 标签中的文字内容。假设文件中有 `标题正文`。 * **命令 (`grep`)**: ```bash # 贪婪匹配(不推荐,会吞掉中间所有内容) grep -o "<.*>" file.html # 非贪婪匹配(加上 ? 变为懒惰模式,精准提取每一个标签) grep -oP "<.*?>" file.html ``` *解析:`-o` 参数表示只输出匹配到的那部分内容,而不是整行。* ### 4. 分组与反向引用(文本替换神器) 这在流编辑器 `sed` 中应用极广。使用 `()` 进行分组,在替换时使用 `\1`、`\2` 来调用前面括号里匹配到的内容。 * **场景**:将文件中所有的日期格式从 `2026/05/20` 批量替换为 `2026-05-20`。 * **命令 (`sed`)**: ```bash sed -E 's/([0-9]{4})\/([0-9]{2})\/([0-9]{2})/\1-\2-\3/g' date.txt ``` *解析:`s/原内容/新内容/g` 是 `sed` 的替换语法。我们将年月日分别用括号包起来,然后在后面通过 `\1`(年)、`\2`(月)、`\3`(日)重新组合并插入横杠。* ### 5. 边界与定位匹配 除了行首 `^` 和行尾 `$`,单词边界 `\b` 也非常实用,可以防止匹配到长单词的一部分。 * **场景**:在代码中精准搜索变量名 `to`,但不希望匹配到 `total` 或 `tool` 里的 `to`。 * **命令 (`grep`)**: ```bash grep -w "to" code.py # 或者使用正则边界符 grep "\bto\b" code.py ``` *解析:`\b` 能够精准锁定单词的开头和结尾边界。* --- 💡 **Linux 正则小贴士:** * **引号的使用**:在写正则时,强烈建议用**单引号 `''`** 把整个正则表达式包起来,这样可以防止 Linux Shell 提前解析里面的特殊符号(比如 `$` 在 Shell 里代表变量,但在正则里代表行尾)。 * **工具的选择**: * 只想**查看/过滤**某些行?用 `grep`。 * 想要**修改/替换**文件内容?用 `sed`。 * 想要按列**截取/统计**复杂数据?用 `awk`(它默认就支持扩展正则)。 你可以打开终端,随便找个文本文件试试上面这几个命令,感受一下 Linux 下正则表达式的强大! --- 结合我们刚才在 Excel 和 Linux 中的实战交流,这里为你系统梳理一份正则表达式的核心匹配模式与特殊字符速查表。 ### 🧩 核心匹配模式与逻辑 正则表达式不仅仅是单个字符的拼凑,更包含了几种决定“怎么找”的核心逻辑: * **基础/普通匹配**:不使用任何特殊符号,写什么就匹配什么(例如输入 `abc` 只能匹配连续的 abc)。 * **元字符匹配**:使用具有特殊含义的符号来代表一类字符(如 `\d` 代表任意数字,`.` 代表任意非换行字符)。 * **量词匹配**:控制前面的元素需要重复出现多少次(如 `+` 表示至少一次,`{n,m}` 表示指定次数范围)。 * **贪婪与非贪婪(懒惰)匹配**: * **贪婪**:默认模式,尽可能多地匹配字符(如 `.*` 会一口气吞到最后一个符合条件的字符)。 * **非贪婪**:在量词后加 `?`,尽可能少地匹配,遇到第一个符合条件的就停止(如 `.*?`)。 * **分组与反向引用**:用 `()` 把一部分规则包起来当作一个整体,后续可以通过 `$1`、`\1` 等符号提取或重组这部分内容。 * **边界与定位匹配**:不匹配具体的字符,而是匹配特定的位置(如 `^` 锁定开头,`\b` 锁定单词边界)。 --- ### 🔠 常用特殊字符与语法速查表 为了方便你日常查阅,我将常用的特殊字符按功能分类整理如下: | 分类 | 特殊字符 / 语法 | 含义与作用 | | :--- | :--- | :--- | | **预定义字符** | `.` | 匹配除换行符以外的任意单个字符 | | (元字符) | `\d` / `\D` | 匹配数字 `[0-9]` / 匹配非数字 | | | `\w` / `\W` | 匹配字母、数字、下划线 / 匹配非单词字符 | | | `\s` / `\S` | 匹配空白字符(空格、制表符等)/ 匹配非空白字符 | | **字符集合** | `[abc]` | 匹配括号内的任意一个字符(如 a、b 或 c) | | | `[^abc]` | 匹配**不在**括号内的任意一个字符(取反) | | | `[a-z]` | 匹配指定范围内的任意字符(如所有小写字母) | | **量词** | `*` | 匹配前一个元素 0 次或多次(可有可无) | | (控制次数) | `+` | 匹配前一个元素 1 次或多次(至少出现一次) | | | `?` | 匹配前一个元素 0 次或 1 次(最多出现一次) | | | `{n}` | 精确匹配前一个元素 n 次 | | | `{n,}` | 匹配前一个元素至少 n 次 | | | `{n,m}` | 匹配前一个元素 n 到 m 次 | | **边界与定位** | `^` | 匹配字符串或一行的**开头** | | | `$` | 匹配字符串或一行的**结尾** | | | `\b` / `\B` | 匹配单词的边界(如空格前后)/ 匹配非单词边界 | | **逻辑与分组** | `()` | **分组**,将内部的子模式视为一个整体,并捕获内容 | | | `\|` | **逻辑或**,匹配左边或右边的表达式(如 `cat\|dog`) | | **转义字符** | `\` | **转义**,让后面的特殊字符失去特殊含义,变成普通字符 | | | | (例如 `\.` 只匹配真实的点号,而不是任意字符) | 你可以把这张表格保存下来,以后无论是写 Excel 公式还是在 Linux 终端敲命令,随时拿出来对照即可! ---