如何用ICU正则捕获Obsidian YAML前置元数据中的所有标签?
问题分析与解决
先逐个拆解你现有正则的问题:
正则
\s*?-\s([_/\w]*)\n
这个正则没有限定匹配上下文,只要是YAML里以缩进+-开头的列表项都会被命中——不管这个列表属于tags:还是其他属性(比如categories:下的列表),所以会捕获所有数组项,而非仅tags:下的标签。正则
(?<=tags:\n)\s*?-\s([_/\w]*)\n(?=[^\s])
两个核心问题:- 正向断言
(?=[^\s])要求标签行后必须跟着非空白字符,但tags:下的后续标签行开头是缩进空格,不满足该条件,因此只能匹配第一个标签,后面的标签会被过滤。 - 未考虑YAML结束符
---的场景:如果tags:是YAML最后一个属性,后面直接是---,这个断言无法匹配,导致正则失效。
- 正向断言
正则
(?<=^tags:\n)(.*?)(?=\n[^\s])
它捕获的是tags:行到下一个顶格行之间的整个文本块,而非单个标签内容,自然会包含每个标签前的缩进、-和空格这些多余格式符号;同时也存在无法识别---结束场景的问题。
可行的ICU正则方案
针对Siri Shortcuts的ICU正则,你可以用这个全局匹配的正则精准捕获tags:下的所有标签文本:
(?m)(?<=^tags:\s*\n)(?:^\s*-\s)([_\w/]+)(?=\n|^---$)
规则说明:
(?m):开启多行模式,让^和$匹配每行的开头与结尾。(?<=^tags:\s*\n):正向后顾断言,匹配顶格的tags:行(允许tags:后带任意空格再换行),确保只锁定tags:下的列表。(?:^\s*-\s):匹配标签行的缩进、-和空格,用非捕获组避免捕获这些格式符号。([_\w/]+):捕获标签文本,支持下划线、字母数字、斜杠格式。(?=\n|^---$):正向前瞻断言,匹配标签行后的换行,或YAML结束符---行,覆盖所有结束场景。
在Siri Shortcuts中开启全局匹配选项,就能一次性捕获所有tags:下的标签。
内容的提问来源于stack exchange,提问作者Calion
相关产品推荐
相关产品推荐

