跳到主要内容

P5563. 边缘模型清洗

场次:2026年9月23日-非AI方向 · 来源:CodeFun2000 P5563

题目描述​

云网络设备做自动化部署时,边缘设备资源很紧,要尽快把 YANG 模型装进内存,因此得先把模型文件里多余的说明文字、初始取值之类信息清掉。

请按下面的规则写一个函数:这些字段要去掉,注释必须原封不动留下来,最后把清洗结果作为字符串返回。

清洗规则​

规则1:目标字段删除

  • 要删掉的关键字:remarkremark、presetpreset、requiredrequired
  • 删掉的跨度:从该关键字第一个字符起,一直删到本句结束用的 ;;(这个分号也删掉)
  • 允许跨行:关键字和分号中间可以夹着换行,匹配与删除都要跨过这些行

规则2:内容处理

  • 被删区间:从关键字第一个字符到分号 ;;
  • 区间里面:换行符 \n\n 留下,别的字符(空格、正文、分号)都拿掉
  • 处理后的样子:
    • 关键字左边、还没进入区间的缩进空白,照原样留着
    • 不管这句有没有跨行,每一行在区间里都只剩换行,行的条数不增不减

规则3:注释保护

  • 单行注释:从 //// 起直到这一行结束
  • 多行注释:从 /∗/* 起直到 ∗/*/,中间可以换行
  • 保留方式:注释整段照抄,不能被清掉

规则4:边界定义

  • 关键字左侧只能是:一行的开头、空格、制表符、{\{ 或 ;;
  • 关键字右侧只能是:空格、制表符、换行或 ;;
  • 两侧对不上:就当成普通名字,不要删(例如 myremarkmyremark)

输入格式​

  • 给出一段字符串,内容是 YANG 文本
  • 保证这段文本语法大体正确,分号 ;; 都是真正的语句结束

输出格式​

  • 输出清洗之后的 YANG 字符串:指定关键字连同它后面直到分号的内容已经去掉,注释仍在

示例​

示例 1​

输入:

container node {
leaf port {
type string;
remark "Edge port";
preset "eth0";
}
/*
块注释中出现 remark "fake";
整段都要留下
*/
leaf flag {
type string;
remark
"Line-a
Line-b";
required true;
}
leaf alias {
type string;
myremark "keep";
}
}

输出:

container node {
leaf port {
type string;


}
/*
块注释中出现 remark "fake";
整段都要留下
*/
leaf flag {
type string;



}
leaf alias {
type string;
myremark "keep";
}
}

说明:

只含空格的行在渲染里容易看成空行,下面按行写清空格个数。

  • remark "Edge port";remark\ "Edge\ port"; 与 preset "eth0";preset\ "eth0"; 两行,关键字左侧各有 88 个空格,这些空格留在区间外,所以这两行各剩 88 个空格。
  • 块注释整段照抄,里面的 remark "fake";remark\ "fake"; 不动。
  • 跨行的 remarkremark:关键字所在行左侧有 88 个空格,保留;接下来 Line−aLine-a、Line−bLine-b 两行整行都落在区间里,只留下换行,行首没有空格。接着 required true;required\ true; 那一行左侧又是 88 个空格,保留。所以 type string;type\ string; 和 leaf flagleaf\ flag 的右括号之间,空格数依次是 88、00、00、88。
  • myremarkmyremark 左侧是字母,不是合法边界,整行保留。

示例 2​

输入:

leaf y {
remark "y";
}

输出:

leaf y {

}

说明:

中间那一行关键字左侧有 44 个空格,清洗后这 44 个空格还在。

提示​

  1. 执行顺序:规则 11 到 44 按这个先后做,也就是先圈出要删的片段,再按区间规则改写片段,接着把注释保住,最后用两侧边界再核对一遍。
  2. 注释一律保留:注释里就算出现了目标关键字,也整段不动。
  3. 可以跨行:一次删除允许盖住很多行,删完以后换行的骨架还在。
  4. 两侧边界:只有左右都满足边界,这个关键字才删;否则当普通名字留下。
  5. 语法不用再查:输入已经保证大体合法,不必另做语法检查。
  6. 可以放心简化:关键字那一句里(跨不跨行都一样)不会夹注释;引号中间也不会再嵌套关键字。例如不用处理 remarkremark // remarkremark notenote,也不用处理 remarkremark "xxxx remarkremark notenote";。
加载评论中...