使用正则表达式有条件地向特定行添加文本

使用正则表达式有条件地向特定行添加文本
最新回答
青柠之恋

2021-12-10 04:28:55

使用正则表达式有条件地向特定行添加文本的核心方法是通过负向先行断言(Negative Lookahead)结合行锚点与捕获组,确保仅在目标行不包含指定词汇时追加内容,同时精确匹配单行范围。

具体实现步骤
  1. 识别目标行并捕获内容

    使用正则表达式 (s*schemas:.*) 匹配以 schemas: 开头的行,并捕获整行内容。

    s*:匹配行首零个或多个空白字符(处理缩进)。

    schemas::匹配字面字符串。

    .*:匹配 schemas: 后到行尾的所有字符。

    (...):捕获组,存储匹配的整行内容供后续替换使用。

  2. 条件判断:排除包含指定词汇的行

    通过负向先行断言 ^(?!.*(?:foos*$|foo,)) 确保当前行不包含独立项 foo。

    ^ 和 $:行锚点,限定匹配范围为单行。

    (?!...):负向先行断言,断言后续内容不匹配括号内模式。

    .*:匹配任意字符(零个或多个)。

    (?:foos*$|foo,):非捕获组,匹配两种情况之一:

    foos*$:foo 后跟零个或多个空白字符且为行尾(如 schemas: bar,foo)。

    foo,:foo 后跟逗号(如 schemas: foo,bar)。

  3. 替换操作

    替换字符串为 $1,foo,其中 $1 引用捕获的原始行内容,并在行尾追加 ,foo。

示例代码(Java)import java.util.regex.*;public class RegexConditionalAppend { public static void main(String[] args) { String yamlContent = """ some: other,line schemas: core,ext,plugin another: line,with,foo schemas: bar,baz yet: another,line """; // 正则表达式:匹配不包含独立项 "foo" 的 schemas: 行 String regex = "^(?!.*(?:foos*$|foo,))(s*schemas:.*)$"; String replacement = "$1,foo"; Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE); Matcher matcher = pattern.matcher(yamlContent); StringBuffer result = new StringBuffer(); while (matcher.find()) { matcher.appendReplacement(result, replacement); } matcher.appendTail(result); System.out.println("修改后的内容:n" + result.toString()); }}关键注意事项
  • 行锚点与多行模式

    Java 中需使用 Pattern.MULTILINE 标志,使 ^ 和 $ 匹配每一行的开头和结尾,而非整个字符串。

  • 精确匹配独立项

    负向先行断言需排除 food、fool 等包含 foo 的词,仅匹配独立项 foo(如 foo, 或行尾 foo)。

  • 性能优化

    负向先行断言可能增加资源消耗,对于大文件可考虑先字符串查找再正则替换。

  • 负向后行断言的局限性

    Java 不支持可变长度模式的负向后行断言(如 .*),因此负向先行断言更灵活。

应用场景
  • 配置文件管理:自动化修改 YAML、JSON 等文件的特定行。
  • 数据清洗:在文本处理中条件性追加或修改内容。
  • 脚本开发:结合正则表达式实现复杂的文本操作逻辑。

通过结合行锚点、捕获组和负向先行断言,正则表达式能够高效解决有条件修改文本行的需求,适用于多种自动化处理场景。