Java正则表达式:为YAML中不含foo的schemas行追加foo
解决方案
核心思路
你之前的正则用了(?s)单行模式,导致会检查整个文本是否存在foo,而非仅针对schemas:所在的单行判断。正确做法是启用多行模式,只对目标行做匹配和检查。
正则表达式与替换规则
- 正则表达式(必须启用多行模式
Pattern.MULTILINE):^(\\s*schemas:)(?!.*\\bfoo\\b)(.*)$ - 替换字符串:
$1$2,foo
正则各部分解释
^\\s*schemas::匹配以任意数量空格开头、后跟schemas:的行首内容(捕获为分组1)(?!.*\\bfoo\\b):负向预查,确保当前行里没有独立的foo(\\b是单词边界,避免误匹配foobar这类包含foo的字符串;不需要精确匹配的话可以去掉\\b)(.*)$:匹配该行schemas:之后的所有内容(捕获为分组2)
Java代码示例
import java.util.regex.Matcher; import java.util.regex.Pattern; public class YamlSchemaUpdate { public static void main(String[] args) { String yaml = """ schemas: core,ext,plugin config: foo,test another: bar """; // 编译正则,启用多行模式 Pattern pattern = Pattern.compile("^(\\s*schemas:)(?!.*\\bfoo\\b)(.*)$", Pattern.MULTILINE); Matcher matcher = pattern.matcher(yaml); // 执行替换 String updatedYaml = matcher.replaceAll("$1$2,foo"); System.out.println(updatedYaml); } }
效果说明
- 若
schemas:行不含foo,会自动追加,foo,比如schemas: core,ext,plugin会变成schemas: core,ext,plugin,foo - 若
schemas:行已包含foo,则不做任何修改 - 其他行的
foo完全不影响匹配结果
内容的提问来源于stack exchange,提问作者Uwe
相关产品推荐
相关产品推荐

