正则表达式中 “$” 并不是表示 “字符串结束

admin3周前笔记27

这篇文章写一写我最近在用 Python 的正则表达式模块(re)开发 CPython 的 SBOM 工具时发现的一个令人惊讶的行为。

如果用过正则表达式,你可能知道 ^ 表示 “字符串开始”,并相应地将 $ 视为 “字符串结束”。因此认为, cat$ 模式会匹配字符串 "lolcat" ,但不会匹配 "internet cat video"

^ 的行为让我认为 $ 也是类似的,但这并不一定成立,而且这种行为取决于不同编程语言及其写法。

特别是对于 Python 来说,如果禁用了多行模式(这是默认设置),那么,$ 字符不仅可以匹配字符串的末尾,还可以匹配字符串末尾的换行符。

所以,如果你试图匹配一个末尾没有换行符的字符串,在 Python 中使用 $ 是做不到的!我本以为禁用多行模式后,就不会有这种匹配换行符的行为,但事实恰恰相反。

下一个合乎逻辑的问题是,如何在 Python 中匹配一个末尾不含换行符的字符串?

在对 Python 和其它正则表达式语法进行多番研究后,我还发现了 \z 和 \Z 可以用于匹配 “字符串结束” 字符。

在 Python 中,可以用 re.MULTILINE 来启用多行模式,文档的描述如下:

当指定 re.MULTILINE 时,模式字符 '$' 会匹配字符串末尾以及每一行末尾(包含换行符)。默认情况下,'$' 只匹配字符串末尾以及字符串末尾的换行符之前(如果有的话)。

让我们看看这些特性在不同平台上是什么表现:

模式匹配 "cat\n"?"cat$" 多行模式"cat$" 无多行模式"cat\z""cat\Z"
PHP
ECMAScript⚠️⚠️
Python⚠️
Golang⚠️
Java 8
.NET 7.0
Rust⚠️
  • ✅: 模式与字符串 "cat\n" 匹配

  • ❌: 模式与字符串 "cat\n" 不匹配

  • ⚠️: 模式无效或不支持该用法

综合上述表格,如果要匹配换行符,那么在所有语言中使用多行模式的 $ ,都能匹配成功;但如果不想匹配换行符,事情就会变得复杂起来。

如果不想匹配换行符,在除了 Python 和 ECMAScript 外的其它语言中,你可以使用 \z。而在 Python 中,你需要使用 \Z ,在 ECMAScript 中使用非多行模式的 $


相关文章

WiFi 网络也可以这么玩

WiFi 网络也可以这么玩

在 Linux 里有很多程序来设置无线连接,我们可以用 ip 和 iw 来配置因特网连接,但是对于新手来说有点复杂。所以我们会使用 netctl 命令,这是一个基于命令行的工具,用来通过配置...

TCP加速 一键安装管理脚本 | BBR/BBR2的原版/Plus/魔改/锐速(LotServer)N合1超级一键加速脚本

此脚本是由 cx9208 在千影脚本的基础上二次开发而成,集合BBR、BBR plus、BBR魔改、锐速(LotServer)4种加速模式的4合1脚本。TCP加速 一键安装管理脚本项目地址:https...

网站性能优化的常用方法

网站性能优化的常用方法

集成 CDN内容交付网络(又名 CDN)是一个非常棒的工具,可以集成到你的网站中,因为它可以大大加快你的内容交付速度。因为它是一个分布式服务器网络,所以 CDN 会找到离用户最近的服务器并部署它来交付...

Powershell学习之道-文件夹共享及磁盘映射

文件夹共享概述共享文件夹的应用非常广泛,客户端对服务器端进行文件管理,局域网文件直传等等,在linux下,可以简单的安装smaba协议,简单的配置之后即可使用。在windows下,可以通过图形化的操作...

linux安全篇:禁止频繁访问的ip访问nginx

linux安全篇:禁止频繁访问的ip访问nginx

实验环境:版本:redhat6.5ip:172.16.1.100,172.16.10软件:nginx172.16.1.10部署nginx[root@localhost tools]#&nbs...

玩转 Windows 10 中的 Linux 子系统

玩转 Windows 10 中的 Linux 子系统

Web 开发人员们不用再苦恼所用的 Windows 开发平台上没有合适的 Linux 工具和库了。WSL 是由 Windows 内核团队与 Canonical 合作设计和开发的,可以让 Windows...

发表评论    

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