.NET正则匹配YAML中竖线开头多行字符串的换行符
.NET正则匹配YAML多行块内换行符的解决方案
核心思路
基于YAML块的缩进规则:|所在行的缩进级别是基准,后续行只要缩进量大于基准级别,就属于多行块内容;缩进量小于等于基准级别时,块结束。我们需要利用.NET正则的特性(比如可变长度后瞻)来捕获基准缩进,再精准匹配块内的换行符。
优化后的正则表达式
(?m)(?<=^(\s*).*: \|\s*(?:\r?\n\1[^\S\r\n].*)*)(\r?\n)(?!(?:\s{0,${#1}}|\1)\S)
关键修复与解释
- 解决回溯引用未定义问题:利用.NET支持的可变长度后瞻,先捕获
|所在行的缩进量到分组\1,后瞻部分通过(?:\r?\n\1[^\S\r\n].*)*匹配块内已有的缩进内容,确保后瞻中\1已被正确定义。 - 完善缩进检查逻辑:负前瞻部分
(?!(?:\s{0,${#1}}|\1)\S),其中${#1}是.NET正则中获取分组\1长度的语法,\s{0,${#1}}覆盖了缩进量小于等于基准级别的情况,只要后续行的缩进不超过基准级别且有非空白字符,就判定为块结束,不会匹配此处的换行。 - 避免误匹配块末换行:通过严格的缩进判断,只有当换行后的行缩进量大于基准级别时,才会被视为块内换行;块末与下一个YAML键之间的换行,因为下一行缩进量等于或小于基准级别,会被负前瞻排除,不会被匹配。
补充说明
- 该正则仅匹配多行块内的换行符,不会触及块外的YAML结构换行。
- 适配Windows(
\r\n)和Unix(\n)两种换行格式。 - 若需要处理带折叠标记的
|+/|-,可调整正则中: \|部分为: \|[-+]?。
内容的提问来源于stack exchange,提问作者Blaisem
相关产品推荐
相关产品推荐

