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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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


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


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


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

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


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


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

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

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

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


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

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

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


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

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


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


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


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

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

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


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


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


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


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

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


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


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


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


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

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


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


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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

标签:
  • 热门焦点
  • Redmi Pad评测:红米充满野心的一次尝试

    从Note系列到K系列,从蓝牙耳机到笔记本电脑,红米不知不觉之间也已经形成了自己颇有竞争力的产品体系,在中端和次旗舰市场上甚至要比小米新机的表现来得更好,正所谓“大丈夫生居
  • 六大权益!华为8月服务日开启:手机免费贴膜、维修免人工费

    8月5日消息,一年一度的华为开发者大会2023(Together)日前在松山湖拉开帷幕,与此同时,华为8月服务日也式开启,到店可享六大专属权益。华为用户可在华为商城Ap
  • 2023 年的 Node.js 生态系统

    随着技术的不断演进和创新,Node.js 在 2023 年达到了一个新的高度。Node.js 拥有一个庞大的生态系统,可以帮助开发人员更快地实现复杂的应用。本文就来看看 Node.js 最新的生
  • 三万字盘点 Spring 九大核心基础功能

    大家好,我是三友~~今天来跟大家聊一聊Spring的9大核心基础功能。话不多说,先上目录:图片友情提示,本文过长,建议收藏,嘿嘿嘿!一、资源管理资源管理是Spring的一个核心的基础功能,不
  • 共享单车的故事讲到哪了?

    来源丨海克财经与共享充电宝相差不多,共享单车已很久没有被国内热点新闻关照到了。除了一再涨价和用户直呼用不起了。近日多家媒体再发报道称,成都、天津、郑州等地多个共享单
  • 支持aptX Lossless无损传输 iQOO TWS 1赛道版发布限时优惠价369元

    2023年7月4日,“无损音质,声动人心”iQOO TWS 1正式发布,支持aptX Lossless无损传输,限时优惠价369元。iQOO TWS 1耳机率先支持端到端aptX Lossless无
  • OPPO K11搭载长寿版100W超级闪充:26分钟充满100%

    据此前官方宣布,OPPO将于7月25日也就是今天下午14:30举办新品发布会,届时全新的OPPO K11将正式与大家见面,将主打旗舰影像,和同档位竞品相比,其最大的卖
  • SN570 NVMe SSD固态硬盘 价格与性能兼具

    SN570 NVMe SSD固态硬盘是西部数据发布的最新一代WD Blue系列的固态硬盘,不仅闪存技术更为精进,性能也得到了进一步的跃升。WD Blue SN570 NVMe SSD的包装外
  • 北京:科技教育体验基地开始登记

      北京“科技馆之城”科技教育体验基地登记和认证工作日前启动。首批北京科技教育体验基地拟于2023年全国科普日期间挂牌,后续还将开展常态化登记。  北京科技教育体验基
Top