本文轉載自微信公眾號「 豌豆花下貓」,作者 Python貓 。BNr28資訊網——每日最新資訊28at.com
這篇文章寫一寫我最近在用 Python 的正則表達式模塊(re)開發 CPython 的 SBOM 工具時發現的一個令人驚訝的行為。BNr28資訊網——每日最新資訊28at.com
如果用過正則表達式,你可能知道 ^ 表示 “字符串開始”,并相應地將 $ 視為 “字符串結束”。因此認為, cat$ 模式會匹配字符串 "lolcat" ,但不會匹配 "internet cat video"。BNr28資訊網——每日最新資訊28at.com
^ 的行為讓我認為 $ 也是類似的,但這并不一定成立,而且這種行為取決于不同編程語言及其寫法。BNr28資訊網——每日最新資訊28at.com
特別是對于 Python 來說,如果禁用了多行模式(這是默認設置),那么,$ 字符不僅可以匹配字符串的末尾,還可以匹配字符串末尾的換行符。BNr28資訊網——每日最新資訊28at.com
所以,如果你試圖匹配一個末尾沒有換行符的字符串,在 Python 中使用 $ 是做不到的!我本以為禁用多行模式后,就不會有這種匹配換行符的行為,但事實恰恰相反。BNr28資訊網——每日最新資訊28at.com
下一個合乎邏輯的問題是,如何在 Python 中匹配一個末尾不含換行符的字符串?BNr28資訊網——每日最新資訊28at.com
在對 Python 和其它正則表達式語法進行多番研究后,我還發現了 /z 和 /Z 可以用于匹配 “字符串結束” 字符。BNr28資訊網——每日最新資訊28at.com
在 Python 中,可以用 re.MULTILINE 來啟用多行模式,文檔的描述如下:BNr28資訊網——每日最新資訊28at.com
當指定 re.MULTILINE 時,模式字符 '$' 會匹配字符串末尾以及每一行末尾(包含換行符)。默認情況下,'$' 只匹配字符串末尾以及字符串末尾的換行符之前(如果有的話)。BNr28資訊網——每日最新資訊28at.com
讓我們看看這些特性在不同平臺上是什么表現:BNr28資訊網——每日最新資訊28at.com
模式匹配 "cat/n"? BNr28資訊網——每日最新資訊28at.com | "cat$" 多行模式 BNr28資訊網——每日最新資訊28at.com | "cat$" 無多行模式 BNr28資訊網——每日最新資訊28at.com | "cat/z" BNr28資訊網——每日最新資訊28at.com | "cat/Z" BNr28資訊網——每日最新資訊28at.com |
PHP BNr28資訊網——每日最新資訊28at.com | ? BNr28資訊網——每日最新資訊28at.com | ? BNr28資訊網——每日最新資訊28at.com | ? BNr28資訊網——每日最新資訊28at.com | ? BNr28資訊網——每日最新資訊28at.com |
ECMAScript BNr28資訊網——每日最新資訊28at.com | ? BNr28資訊網——每日最新資訊28at.com | ? BNr28資訊網——每日最新資訊28at.com | ?? BNr28資訊網——每日最新資訊28at.com | ?? BNr28資訊網——每日最新資訊28at.com |
Python BNr28資訊網——每日最新資訊28at.com | ? BNr28資訊網——每日最新資訊28at.com | ?BNr28資訊網——每日最新資訊28at.com | ?? BNr28資訊網——每日最新資訊28at.com | ? BNr28資訊網——每日最新資訊28at.com |
Golang BNr28資訊網——每日最新資訊28at.com | ? BNr28資訊網——每日最新資訊28at.com | ? BNr28資訊網——每日最新資訊28at.com | ? BNr28資訊網——每日最新資訊28at.com | ?? BNr28資訊網——每日最新資訊28at.com |
Java 8 BNr28資訊網——每日最新資訊28at.com | ? BNr28資訊網——每日最新資訊28at.com | ? BNr28資訊網——每日最新資訊28at.com | ? BNr28資訊網——每日最新資訊28at.com | ? BNr28資訊網——每日最新資訊28at.com |
.NET 7.0 BNr28資訊網——每日最新資訊28at.com | ? BNr28資訊網——每日最新資訊28at.com | ? BNr28資訊網——每日最新資訊28at.com | ? BNr28資訊網——每日最新資訊28at.com | ? BNr28資訊網——每日最新資訊28at.com |
Rust BNr28資訊網——每日最新資訊28at.com | ? BNr28資訊網——每日最新資訊28at.com | ? BNr28資訊網——每日最新資訊28at.com | ? BNr28資訊網——每日最新資訊28at.com | ?? BNr28資訊網——每日最新資訊28at.com |
- ?: 模式與字符串 "cat/n" 匹配
- ?: 模式與字符串 "cat/n" 不匹配
- ??: 模式無效或不支持該用法
綜合上述表格,如果要匹配換行符,那么在所有語言中使用多行模式的 $ ,都能匹配成功;但如果不想匹配換行符,事情就會變得復雜起來。BNr28資訊網——每日最新資訊28at.com
如果不想匹配換行符,在除了 Python 和 ECMAScript 外的其它語言中,你可以使用 /z。而在 Python 中,你需要使用 /Z ,在 ECMAScript 中使用非多行模式的 $。BNr28資訊網——每日最新資訊28at.com
今天這些關于正則表達式的知識,你學會了么?BNr28資訊網——每日最新資訊28at.com
注意:上述數據表的信息收集自 regex101.com,我沒有用實際的編程環境進行測試。BNr28資訊網——每日最新資訊28at.com
作者:Seth LarsonBNr28資訊網——每日最新資訊28at.com
譯者:豌豆花下貓@Python貓BNr28資訊網——每日最新資訊28at.com
英文:Regex character “$” doesn't mean “end-of-string”BNr28資訊網——每日最新資訊28at.com
本文鏈接:http://www.tebozhan.com/showinfo-26-83786-0.html正則表達式中 “$” 并不是表示 “字符串結束”
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: 通過JS獲取你當前的網絡狀況?建議大家學一學~
下一篇: 設計模式之代理模式:為對象提供一個“替身”