sublime中跨行匹配失败是因为pcre默认模式下.不匹配换行符,需在正则开头加(?s)启用dotall模式;例如匹配python docstring应写(?s)"""1*?""",替换时用捕获组$1保留原结构。" ↩

Sublime 中跨行匹配多行字符串为什么默认失败
因为 Sublime Text 默认的正则引擎(PCRE)在单行模式下,. 不匹配换行符 \n,所以写 foo.*bar 这类表达式时,只要中间有换行就完全不匹配。
这不是 bug,是标准行为。但用户想搜跨行文本(比如一段带换行的 JSON 片段、HTML 标签块、Python docstring),就必须显式启用“单行模式”(dotall mode)。
- 必须在正则开头加
(?s)—— 这是唯一可靠且跨 Sublime 版本兼容的方式 -
(?s)让.匹配包括\n在内的所有字符 - 别用
(?m)(多行模式),它只影响^和$的行为,对.无效 - Sublime 的搜索框里不能用
/pattern/gs这种 JS 风格语法,只认 PCRE 内联标志
怎么写一个能匹配含换行的 Python docstring 的正则
比如要搜:"""这是\n跨行的\ndocstring""",注意引号和内部换行都得兼顾。
正确写法:(?s)"""[^"]*?"""
-
(?s)启用 dotall,让[^"]*能跨行吃掉换行符 -
[^"]*?是非贪婪匹配,避免一口气吃到文件末尾最后一个""" - 如果 docstring 里可能含转义引号(如
\"""),这个简单写法就不够,得改用更复杂的平衡逻辑,但绝大多数场景不需要 - 实际使用时,把整个表达式粘贴进 Sublime 搜索框,勾选
.*(正则模式)即可
匹配 HTML 标签块时容易漏掉的边界问题
搜 <div class="content">...任意内容(含换行)...</div>,常见错误是直接写 <div.></div.> —— 它在跨行时根本不会生效。
正确写法:(?s)<div>]*>.*?</div>
-
(?s)必须放在最前面,否则无效 -
[^>]*防止<div> 后面属性太多时,<code>.*?误吞下一个标签开头 - 如果目标 HTML 里有嵌套
<div>(比如 <code><div>...<div>...</div>...</div>),这个正则会提前闭合,无法处理嵌套——Sublime 原生正则不支持递归,这时得靠手动分段或外部工具 - 性能上,
.*?跨大量行时会变慢,如果知道大致范围,可用(?s)<div>]*>[\s\S]{1,2000}?</div>限长替代 - 搜索填:
(?s)("""[^"]*?""")(加括号捕获) - 替换填:
/* DOCSTRING */或/* $1 */(保留原内容) - 别在替换里硬写
\n,Sublime 会把它当字面量,而不是换行符 - 如果替换内容本身要换行,按 Ctrl+Enter(Windows/Linux)或 Cmd+Enter(macOS)插入真实换行,不是输入
\n
替换时保留原始换行结构的关键细节
跨行搜索后做替换,比如把所有 docstring 替成占位符,但又不想破坏原有缩进和空行。
关键是:替换字段里不要动 \n,而要用 $0 或捕获组引用原始内容。
跨行正则真正麻烦的从来不是语法,而是你忘了 (?s) 往往就卡住一上午;另外,一旦内容里出现未预期的引号、尖括号或嵌套,简单正则就会失效——这时候不如先用 Ctrl+Shift+P → “Expand Selection to Brackets” 辅助定位,再手动操作。











