如何在多行文本中查找后续3行内无workdays的schedule?
正则匹配:查找
schedule:后3行内未出现workdays:的场景 需求说明
你需要从大量JSON/YAML格式的文件中,找出所有满足「schedule:之后的3行内未出现workdays:」的片段:
- 不应匹配的示例(包含
workdays:):
actions: - name: email template: email_exp_csr_008 schedule: week: false workdays: true persistent: true
- 应匹配的示例(无
workdays:):
actions: - name: email template: email_exp_csr_008 schedule: week: false persistent: true werwer: True
之前正则的问题
你写的schedule:(.*\n){0,3}.*[^(workdays)]逻辑错误:
[^(workdays)]是匹配单个不是括号、w/o/r/k/d/a/y/s的字符,不是排除整个workdays:字符串- 整体逻辑没有做到“确保3行范围内完全不出现
workdays:”
正确的正则表达式
使用否定前瞻来实现“指定范围内无目标字符串”的逻辑,正则如下:
schedule:(?:(?!workdays:).*\n){0,3}(?!.*workdays:)
拆解说明:
schedule:精准匹配起始标记(?:(?!workdays:).*\n){0,3}:(?!workdays:)是行内否定前瞻,确保当前行的任意位置都不包含workdays:.*\n匹配整行内容(包括换行符){0,3}限制最多匹配3行
(?!.*workdays:)最后做一次兜底检查,确保3行范围内的末尾也没有遗漏的workdays:
使用提示
如果在编辑器(如VS Code)或命令行工具(如grep -P)中使用,记得开启正则多行匹配模式(部分工具默认支持),这样能准确识别每行的边界。
内容的提问来源于stack exchange,提问作者Ivo Brabec
相关产品推荐
相关产品推荐

