本文转载自微信公众号「 豌豆花下猫」,作者 Python猫 。LDe28资讯网——每日最新资讯28at.com
这篇文章写一写我最近在用 Python 的正则表达式模块(re)开发 CPython 的 SBOM 工具时发现的一个令人惊讶的行为。LDe28资讯网——每日最新资讯28at.com
如果用过正则表达式,你可能知道 ^ 表示 “字符串开始”,并相应地将 $ 视为 “字符串结束”。因此认为, cat$ 模式会匹配字符串 "lolcat" ,但不会匹配 "internet cat video"。LDe28资讯网——每日最新资讯28at.com
^ 的行为让我认为 $ 也是类似的,但这并不一定成立,而且这种行为取决于不同编程语言及其写法。LDe28资讯网——每日最新资讯28at.com
特别是对于 Python 来说,如果禁用了多行模式(这是默认设置),那么,$ 字符不仅可以匹配字符串的末尾,还可以匹配字符串末尾的换行符。LDe28资讯网——每日最新资讯28at.com
所以,如果你试图匹配一个末尾没有换行符的字符串,在 Python 中使用 $ 是做不到的!我本以为禁用多行模式后,就不会有这种匹配换行符的行为,但事实恰恰相反。LDe28资讯网——每日最新资讯28at.com
下一个合乎逻辑的问题是,如何在 Python 中匹配一个末尾不含换行符的字符串?LDe28资讯网——每日最新资讯28at.com
在对 Python 和其它正则表达式语法进行多番研究后,我还发现了 /z 和 /Z 可以用于匹配 “字符串结束” 字符。LDe28资讯网——每日最新资讯28at.com
在 Python 中,可以用 re.MULTILINE 来启用多行模式,文档的描述如下:LDe28资讯网——每日最新资讯28at.com
当指定 re.MULTILINE 时,模式字符 '$' 会匹配字符串末尾以及每一行末尾(包含换行符)。默认情况下,'$' 只匹配字符串末尾以及字符串末尾的换行符之前(如果有的话)。LDe28资讯网——每日最新资讯28at.com
让我们看看这些特性在不同平台上是什么表现:LDe28资讯网——每日最新资讯28at.com
模式匹配 "cat/n"? LDe28资讯网——每日最新资讯28at.com | "cat$" 多行模式 LDe28资讯网——每日最新资讯28at.com | "cat$" 无多行模式 LDe28资讯网——每日最新资讯28at.com | "cat/z" LDe28资讯网——每日最新资讯28at.com | "cat/Z" LDe28资讯网——每日最新资讯28at.com |
PHP LDe28资讯网——每日最新资讯28at.com | ✅ LDe28资讯网——每日最新资讯28at.com | ✅ LDe28资讯网——每日最新资讯28at.com | ❌ LDe28资讯网——每日最新资讯28at.com | ✅ LDe28资讯网——每日最新资讯28at.com |
ECMAScript LDe28资讯网——每日最新资讯28at.com | ✅ LDe28资讯网——每日最新资讯28at.com | ❌ LDe28资讯网——每日最新资讯28at.com | ⚠️ LDe28资讯网——每日最新资讯28at.com | ⚠️ LDe28资讯网——每日最新资讯28at.com |
Python LDe28资讯网——每日最新资讯28at.com | ✅ LDe28资讯网——每日最新资讯28at.com | ✅LDe28资讯网——每日最新资讯28at.com | ⚠️ LDe28资讯网——每日最新资讯28at.com | ❌ LDe28资讯网——每日最新资讯28at.com |
Golang LDe28资讯网——每日最新资讯28at.com | ✅ LDe28资讯网——每日最新资讯28at.com | ❌ LDe28资讯网——每日最新资讯28at.com | ❌ LDe28资讯网——每日最新资讯28at.com | ⚠️ LDe28资讯网——每日最新资讯28at.com |
Java 8 LDe28资讯网——每日最新资讯28at.com | ✅ LDe28资讯网——每日最新资讯28at.com | ✅ LDe28资讯网——每日最新资讯28at.com | ❌ LDe28资讯网——每日最新资讯28at.com | ✅ LDe28资讯网——每日最新资讯28at.com |
.NET 7.0 LDe28资讯网——每日最新资讯28at.com | ✅ LDe28资讯网——每日最新资讯28at.com | ✅ LDe28资讯网——每日最新资讯28at.com | ❌ LDe28资讯网——每日最新资讯28at.com | ✅ LDe28资讯网——每日最新资讯28at.com |
Rust LDe28资讯网——每日最新资讯28at.com | ✅ LDe28资讯网——每日最新资讯28at.com | ❌ LDe28资讯网——每日最新资讯28at.com | ❌ LDe28资讯网——每日最新资讯28at.com | ⚠️ LDe28资讯网——每日最新资讯28at.com |
- ✅: 模式与字符串 "cat/n" 匹配
- ❌: 模式与字符串 "cat/n" 不匹配
- ⚠️: 模式无效或不支持该用法
综合上述表格,如果要匹配换行符,那么在所有语言中使用多行模式的 $ ,都能匹配成功;但如果不想匹配换行符,事情就会变得复杂起来。LDe28资讯网——每日最新资讯28at.com
如果不想匹配换行符,在除了 Python 和 ECMAScript 外的其它语言中,你可以使用 /z。而在 Python 中,你需要使用 /Z ,在 ECMAScript 中使用非多行模式的 $。LDe28资讯网——每日最新资讯28at.com
今天这些关于正则表达式的知识,你学会了么?LDe28资讯网——每日最新资讯28at.com
注意:上述数据表的信息收集自 regex101.com,我没有用实际的编程环境进行测试。LDe28资讯网——每日最新资讯28at.com
作者:Seth LarsonLDe28资讯网——每日最新资讯28at.com
译者:豌豆花下猫@Python猫LDe28资讯网——每日最新资讯28at.com
英文:Regex character “$” doesn't mean “end-of-string”LDe28资讯网——每日最新资讯28at.com
本文链接:http://www.28at.com/showinfo-26-83786-0.html正则表达式中 “$” 并不是表示 “字符串结束”
声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com
上一篇: 通过JS获取你当前的网络状况?建议大家学一学~
下一篇: 设计模式之代理模式:为对象提供一个“替身”