当前位置:首页 > 技术 > 正文内容

正则表达式完全指南

访客 技术 2026年7月16日 1

什么是正则表达式

正则表达式(Regular Expression)是一种描述字符串匹配模式的工具,由普通字符和特殊字符(元字符)构成。它广泛应用于文本搜索、数据验证、内容提取等场景,是跨平台、跨语言的标准化技术。

推荐一个实用的在线测试工具:regex101.com,支持实时调试和可视化分析。

模式修饰符

修饰符用于控制匹配行为,通常放在表达式末尾。以下是四个核心修饰符:

全局匹配(g)

默认情况下,正则只返回第一个匹配结果。开启全局模式后,会返回所有匹配项。

多行模式(m)

影响 ^$ 的行为:

  • 关闭时:^ 匹配整个文本开头,$ 匹配整个文本结尾
  • 开启后:^ 可匹配任意行首,$ 可匹配任意行尾

单行模式(s)

默认情况下,点号 . 不匹配换行符 \n。开启后,. 可匹配包括换行符在内的任意字符。

忽略大小写(i)

匹配时不区分英文字母大小写,aA 视为等价。

字符匹配基础

字面量匹配

直接书写目标字符串即可匹配,如 export 可匹配文本中的 "export"。

预定义字符类

符号含义等价写法
.除换行外的任意字符
\d数字字符[0-9]
\D非数字字符[^0-9]
\w单词字符(字母、数字、下划线)[a-zA-Z0-9_]
\W非单词字符[^a-zA-Z0-9_]
\s空白字符(空格、制表符、换行等)
\S非空白字符
\b单词边界
\B非单词边界

自定义字符集

使用方括号 [] 定义匹配范围:

  • [0-9a-f]:匹配十六进制字符
  • [^...]:匹配不在方括号内的字符(取反)
  • [\^$.]:匹配字面量 ^$.(特殊字符需转义)

数量控制

精确量词

  • {n}:恰好出现 n 次
  • {n,}:至少出现 n 次
  • {n,m}:出现 n 到 m 次

简写量词

符号含义等价形式
*零次或多次{0,}
+一次或多次{1,}
?零次或一次{0,1}

贪婪与惰性匹配

默认量词为贪婪模式,尽可能多地匹配字符。在量词后添加 ? 可切换为惰性模式,尽可能少地匹配。

示例:匹配 HTML 中的 span 标签

<span>内容1</span>文本<span>内容2</span>

// 贪婪模式:<span>.*?</span> 匹配整个字符串(错误)
// 惰性模式:<span>.*?</span> 分别匹配两个标签(正确)

分组与捕获

基础分组

圆括号 () 用于创建分组,可实现:

  • 信息提取:通过 $1$2 等引用匹配内容
  • 反向引用:在表达式内部用 \1\2 引用前面分组

示例:匹配对称的 HTML 标签

<(h[1-6])>.*?</\1>

高级分组特性

语法说明
(?<name>...)命名分组,可通过名称而非序号访问
(?:...)非捕获分组,仅用于逻辑分组不保存结果
((...))嵌套分组,按左括号顺序编号

大小写转换

部分编辑器支持替换时的特殊操作符:

  • \u / \U:转大写
  • \l / \L:转小写
  • \E:结束大小写转换

边界断言(零宽断言)

断言用于判断位置条件,不消耗匹配字符:

语法名称说明
(?=...)先行肯定断言后面紧跟指定内容
(?!...)先行否定断言后面不跟指定内容
(?<=...)后行肯定断言前面存在指定内容
(?<!...)后行否定断言前面不存在指定内容

应用示例:排除表头匹配姓名

(?<!姓名\s)\b\w+\b

Java 正则 API

Java 通过 java.util.regex 包提供正则支持,核心类为 PatternMatcher

Pattern 类

负责编译正则表达式:

// 编译模式
Pattern pt = Pattern.compile("\\d+");

// 快速匹配验证
boolean isMatch = Pattern.matches("\\d+", "12345");

// 分割字符串
String[] parts = pt.split("a1b2c3d");

Matcher 类

执行具体的匹配操作:

Pattern pt = Pattern.compile("\\bcat\\b");
Matcher mc = pt.matcher("cat catalog cat");

// 查找所有匹配
while (mc.find()) {
    System.out.println("位置: " + mc.start() + "-" + mc.end());
}

// 匹配检查
boolean fullMatch = mc.matches();      // 要求完全匹配
boolean prefixMatch = mc.lookingAt();  // 要求开头匹配

// 替换操作
String resultAll = mc.replaceAll("dog");    // 替换所有
String resultFirst = mc.replaceFirst("dog");  // 仅替换首个

综合案例

案例一:车牌号校验

规则:首位汉字 + 次位大写字母(不含 I、O)+ 五位字母数字(不含 I、O)

[\u4e00-\u9fa5][A-HJ-NP-Z][A-HJ-NP-Z0-9]{5}

案例二:密码强度验证

要求:8-20 位,必须同时包含大小写字母和数字

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,20}$

案例三:千分位格式化

为数字添加千分位分隔符:

查找:(?<=\d)(?=(\d{3})+$)
替换:,

案例四:提取 JavaScript 字符串

匹配单引号、双引号、反引号包裹的字符串:

(["'`])(?:(?=(\\?))\2.)*?\1

案例五:移除 HTML 注释

<!--[\s\S]*?-->
标签: 正则表达式

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。