当前位置:首页 > 科技  > 软件

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

来源: 责编: 时间:2024-04-16 08:33:53 289观看
导读本文转载自微信公众号「 豌豆花下猫」,作者 Python猫 。这篇文章写一写我最近在用 Python 的正则表达式模块(re)开发 CPython 的 SBOM 工具时发现的一个令人惊讶的行为。如果用过正则表达式,你可能知道 ^ 表示 “字符串开

本文转载自微信公众号「 豌豆花下猫」,作者 Python猫 DSw28资讯网——每日最新资讯28at.com

这篇文章写一写我最近在用 Python 的正则表达式模块(re)开发 CPython 的 SBOM 工具时发现的一个令人惊讶的行为。DSw28资讯网——每日最新资讯28at.com

如果用过正则表达式,你可能知道 ^ 表示 “字符串开始”,并相应地将 $ 视为 “字符串结束”。因此认为, cat$ 模式会匹配字符串 "lolcat" ,但不会匹配 "internet cat video"。DSw28资讯网——每日最新资讯28at.com

^ 的行为让我认为 $ 也是类似的,但这并不一定成立,而且这种行为取决于不同编程语言及其写法。DSw28资讯网——每日最新资讯28at.com

特别是对于 Python 来说,如果禁用了多行模式(这是默认设置),那么,$ 字符不仅可以匹配字符串的末尾,还可以匹配字符串末尾的换行符。DSw28资讯网——每日最新资讯28at.com

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

下一个合乎逻辑的问题是,如何在 Python 中匹配一个末尾不含换行符的字符串?DSw28资讯网——每日最新资讯28at.com

在对 Python 和其它正则表达式语法进行多番研究后,我还发现了 /z 和 /Z 可以用于匹配 “字符串结束” 字符。DSw28资讯网——每日最新资讯28at.com

在 Python 中,可以用 re.MULTILINE 来启用多行模式,文档的描述如下:DSw28资讯网——每日最新资讯28at.com

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

让我们看看这些特性在不同平台上是什么表现:DSw28资讯网——每日最新资讯28at.com

模式匹配 "cat/n"?
DSw28资讯网——每日最新资讯28at.com

"cat$" 多行模式
DSw28资讯网——每日最新资讯28at.com

"cat$" 无多行模式
DSw28资讯网——每日最新资讯28at.com

"cat/z"
DSw28资讯网——每日最新资讯28at.com

"cat/Z"
DSw28资讯网——每日最新资讯28at.com

PHP
DSw28资讯网——每日最新资讯28at.com


DSw28资讯网——每日最新资讯28at.com


DSw28资讯网——每日最新资讯28at.com


DSw28资讯网——每日最新资讯28at.com


DSw28资讯网——每日最新资讯28at.com

ECMAScript
DSw28资讯网——每日最新资讯28at.com


DSw28资讯网——每日最新资讯28at.com


DSw28资讯网——每日最新资讯28at.com

⚠️
DSw28资讯网——每日最新资讯28at.com

⚠️
DSw28资讯网——每日最新资讯28at.com

Python
DSw28资讯网——每日最新资讯28at.com


DSw28资讯网——每日最新资讯28at.com

DSw28资讯网——每日最新资讯28at.com

⚠️
DSw28资讯网——每日最新资讯28at.com


DSw28资讯网——每日最新资讯28at.com

Golang
DSw28资讯网——每日最新资讯28at.com


DSw28资讯网——每日最新资讯28at.com


DSw28资讯网——每日最新资讯28at.com


DSw28资讯网——每日最新资讯28at.com

⚠️
DSw28资讯网——每日最新资讯28at.com

Java 8
DSw28资讯网——每日最新资讯28at.com


DSw28资讯网——每日最新资讯28at.com


DSw28资讯网——每日最新资讯28at.com


DSw28资讯网——每日最新资讯28at.com


DSw28资讯网——每日最新资讯28at.com

.NET 7.0
DSw28资讯网——每日最新资讯28at.com


DSw28资讯网——每日最新资讯28at.com


DSw28资讯网——每日最新资讯28at.com


DSw28资讯网——每日最新资讯28at.com


DSw28资讯网——每日最新资讯28at.com

Rust
DSw28资讯网——每日最新资讯28at.com


DSw28资讯网——每日最新资讯28at.com


DSw28资讯网——每日最新资讯28at.com


DSw28资讯网——每日最新资讯28at.com

⚠️
DSw28资讯网——每日最新资讯28at.com

  • ✅: 模式与字符串 "cat/n" 匹配
  • ❌: 模式与字符串 "cat/n" 不匹配
  • ⚠️: 模式无效或不支持该用法

综合上述表格,如果要匹配换行符,那么在所有语言中使用多行模式的 $ ,都能匹配成功;但如果不想匹配换行符,事情就会变得复杂起来。DSw28资讯网——每日最新资讯28at.com

如果不想匹配换行符,在除了 Python 和 ECMAScript 外的其它语言中,你可以使用 /z。而在 Python 中,你需要使用 /Z ,在 ECMAScript 中使用非多行模式的 $。DSw28资讯网——每日最新资讯28at.com

今天这些关于正则表达式的知识,你学会了么?DSw28资讯网——每日最新资讯28at.com

注意:上述数据表的信息收集自 regex101.com,我没有用实际的编程环境进行测试。DSw28资讯网——每日最新资讯28at.com

作者:Seth LarsonDSw28资讯网——每日最新资讯28at.com

译者:豌豆花下猫@Python猫DSw28资讯网——每日最新资讯28at.com

英文:Regex character “$” doesn't mean “end-of-string”DSw28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-83786-0.html正则表达式中 “$” 并不是表示 “字符串结束”

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 通过JS获取你当前的网络状况?建议大家学一学~

下一篇: 设计模式之代理模式:为对象提供一个“替身”

标签:
  • 热门焦点
  • 俄罗斯:将审查iPhone等外国公司设备 保数据安全

    iPhone和特斯拉都属于在各自领域领头羊的品牌,推出的产品也也都是数一数二的,但对于一些国家而言,它们的产品可靠性和安全性还是在限制范围内。近日,俄罗斯联邦通信、信息技术
  • JavaScript 混淆及反混淆代码工具

    介绍在我们开始学习反混淆之前,我们首先要了解一下代码混淆。如果不了解代码是如何混淆的,我们可能无法成功对代码进行反混淆,尤其是使用自定义混淆器对其进行混淆时。什么是混
  • 不容错过的MSBuild技巧,必备用法详解和实践指南

    一、MSBuild简介MSBuild是一种基于XML的构建引擎,用于在.NET Framework和.NET Core应用程序中自动化构建过程。它是Visual Studio的构建引擎,可在命令行或其他构建工具中使用
  • 梁柱接棒两年,腾讯音乐闯出新路子

    文丨田静 出品丨牛刀财经(niudaocaijing)7月5日,企鹅FM发布官方公告称由于业务调整,将于9月6日正式停止运营,这意味着腾讯音乐长音频业务走向消亡。腾讯在长音频领域还在摸索。为
  • 自律,给不了Keep自由!

    来源 | 互联网品牌官作者 | 李大为编排 | 又耳 审核 | 谷晓辉自律能不能给用户自由暂时不好说,但大概率不能给Keep自由。近日,全球最大的在线健身平台Keep正式登陆港交所,努力
  • 腾讯VS网易,最卷游戏暑期档,谁能笑到最后?

    作者:无锈钵来源:财经无忌7月16日晚,上海1862时尚艺术中心。伴随着幻象的精准命中,硕大的荧幕之上,比分被定格在了14:12,被寄予厚望的EDG战队以绝对的优势战胜了BLG战队,拿下了总决
  • 三星折叠屏手机去年销售近1000万台 今年目标定为1500万

    7月29日消息,三星率先发力可折叠手机市场,在全球市场已经取得了非常亮眼的成绩,接下来会进一步巩固和扩大这一优势。三星在推出Galaxy Z Flip5和Galax
  • AMD的AI芯片转单给三星可能性不大 与台积电已合作至2nm制程

    据 DIGITIMES 消息,英伟达 AI GPU 出货逐季飙升,接下来 AMD MI 300 系列将在第 4 季底量产。而半导体业内人士表示,近日传出 AMD 的 AI 芯片将转单给
  • 微软发布Windows 11新版 引入全新任务栏状态

    近日,微软发布了Windows 11新版,而Build 22563更新主要引入了几周前曝光的平板模式任务栏等,系统更流畅了。更新中,Windows 11加入了专门针对平板优化的任务栏
Top