re
)开发 CPython 的 SBOM 工具时发现的一个令人惊讶的行为。^
表示 “字符串开始”,并相应地将 $
视为 “字符串结束”。因此认为, cat$
模式会匹配字符串 "lolcat"
,但不会匹配 "internet cat video"
。^
的行为让我认为 $
也是类似的,但这并不一定成立,而且这种行为取决于不同编程语言及其写法。$
字符不仅可以匹配字符串的末尾,还可以匹配字符串末尾的换行符。$
是做不到的!我本以为禁用多行模式后,就不会有这种匹配换行符的行为,但事实恰恰相反。re.MULTILINE
来启用多行模式,文档的描述如下:当指定
re.MULTILINE
时,模式字符'$'
会匹配字符串末尾以及每一行末尾(包含换行符)。默认情况下,’$’ 只匹配字符串末尾以及字符串末尾的换行符之前(如果有的话)。
模式匹配 “cat\n”? | “cat$” 多行模式 | “cat$” 无多行模式 | “cat\z” | “cat\Z” |
---|---|---|---|---|
PHP | ✅ | ✅ | ❌ | ✅ |
ECMAScript | ✅ | ❌ | ⚠️ | ⚠️ |
Python | ✅ | ✅ | ⚠️ | ❌ |
Golang | ✅ | ❌ | ❌ | ⚠️ |
Java 8 | ✅ | ✅ | ❌ | ✅ |
.NET 7.0 | ✅ | ✅ | ❌ | ✅ |
Rust | ✅ | ❌ | ❌ | ⚠️ |
"cat\n"
匹配"cat\n"
不匹配$
,都能匹配成功;但如果不想匹配换行符,事情就会变得复杂起来。\z
。而在 Python 中,你需要使用 \Z
,在 ECMAScript 中使用非多行模式的 $
。