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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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


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


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


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

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


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


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

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

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

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


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

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

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


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

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


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


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


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

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

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


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


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


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


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

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


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


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


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


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

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


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


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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

标签:
  • 热门焦点
  • 小米降噪蓝牙耳机Necklace分享:听一首歌 读懂一个故事

    在今天下午的小米Civi 2新品发布会上,小米还带来了一款新的降噪蓝牙耳机Necklace,我们也在发布结束的第一时间给大家带来这款耳机的简单分享。现在大家能见到最多的蓝牙耳机
  • K8S | Service服务发现

    一、背景在微服务架构中,这里以开发环境「Dev」为基础来描述,在K8S集群中通常会开放:路由网关、注册中心、配置中心等相关服务,可以被集群外部访问;图片对于测试「Tes」环境或者
  • 得物效率前端微应用推进过程与思考

    一、背景效率工程随着业务的发展,组织规模的扩大,越来越多的企业开始意识到协作效率对于企业团队的重要性,甚至是决定其在某个行业竞争中突围的关键,是企业长久生存的根本。得物
  • 十个简单但很有用的Python装饰器

    装饰器(Decorators)是Python中一种强大而灵活的功能,用于修改或增强函数或类的行为。装饰器本质上是一个函数,它接受另一个函数或类作为参数,并返回一个新的函数或类。它们通常用
  • 2天涨粉255万,又一赛道在抖音爆火

    来源:运营研究社作者 | 张知白编辑 | 杨佩汶设计 | 晏谈梦洁这个暑期,旅游赛道彻底火了:有的「地方」火了——贵州村超旅游收入 1 个月超过 12 亿;有的「博主」火了&m
  • 10天营收超1亿美元,《星铁》比《原神》差在哪?

    来源:伯虎财经作者:陈平安即便你没玩过《原神》,你一定听说过的它的大名。恨它的人把《原神》开服那天称作是中国游戏史上最黑暗的一天,有粉丝因为索尼在PS平台上线《原神》,怒而
  • 认真聊聊东方甄选:如何告别低垂的果实

    来源:山核桃作者:财经无忌爆火一年后,俞敏洪和他的东方甄选依旧是颇受外界关心的“网红”。7月5日至9日,为期5天的东方甄选“甘肃行”首次在自有App内直播,
  • iQOO 11S或7月上市:搭载“鸡血版”骁龙8Gen2 史上最强5G Soc

    去年底,iQOO推出了“电竞旗舰”iQOO 11系列,作为一款性能强机,iQOO 11不仅全球首发2K 144Hz E6全感屏,搭载了第二代骁龙8平台及144Hz电竞屏,同时在快充
  • 到手价3099元起!iQOO Neo8 Pro今日首销:安卓性能最强旗舰

    5月23日,iQOO如期举行了新品发布会,全新的iQOO Neo8系列也正式与大家见面,包含iQOO Neo8和iQOO Neo8 Pro两个版本,其中标准版搭载高通骁龙8+,而Pro版更
Top