边缘模型清洗
模拟约 1069 字大约 4 分钟
P5563. 边缘模型清洗
场次:2026年9月23日-非AI方向 · 来源:CodeFun2000 P5563
题目描述
云网络设备做自动化部署时,边缘设备资源很紧,要尽快把 YANG 模型装进内存,因此得先把模型文件里多余的说明文字、初始取值之类信息清掉。
请按下面的规则写一个函数:这些字段要去掉,注释必须原封不动留下来,最后把清洗结果作为字符串返回。
清洗规则
规则1:目标字段删除
- 要删掉的关键字:、、
- 删掉的跨度:从该关键字第一个字符起,一直删到本句结束用的 (这个分号也删掉)
- 允许跨行:关键字和分号中间可以夹着换行,匹配与删除都要跨过这些行
规则2:内容处理
- 被删区间:从关键字第一个字符到分号
- 区间里面:换行符 留下,别的字符(空格、正文、分号)都拿掉
- 处理后的样子:
- 关键字左边、还没进入区间的缩进空白,照原样留着
- 不管这句有没有跨行,每一行在区间里都只剩换行,行的条数不增不减
规则3:注释保护
- 单行注释:从 起直到这一行结束
- 多行注释:从 起直到 ,中间可以换行
- 保留方式:注释整段照抄,不能被清掉
规则4:边界定义
- 关键字左侧只能是:一行的开头、空格、制表符、 或
- 关键字右侧只能是:空格、制表符、换行或
- 两侧对不上:就当成普通名字,不要删(例如 )
输入格式
- 给出一段字符串,内容是 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";
}
}说明:
只含空格的行在渲染里容易看成空行,下面按行写清空格个数。
- 与 两行,关键字左侧各有 个空格,这些空格留在区间外,所以这两行各剩 个空格。
- 块注释整段照抄,里面的 不动。
- 跨行的 :关键字所在行左侧有 个空格,保留;接下来 、 两行整行都落在区间里,只留下换行,行首没有空格。接着 那一行左侧又是 个空格,保留。所以 和 的右括号之间,空格数依次是 、、、。
- 左侧是字母,不是合法边界,整行保留。
示例 2
输入:
leaf y {
remark "y";
}输出:
leaf y {
}说明:
中间那一行关键字左侧有 个空格,清洗后这 个空格还在。
提示
- 执行顺序:规则 到 按这个先后做,也就是先圈出要删的片段,再按区间规则改写片段,接着把注释保住,最后用两侧边界再核对一遍。
- 注释一律保留:注释里就算出现了目标关键字,也整段不动。
- 可以跨行:一次删除允许盖住很多行,删完以后换行的骨架还在。
- 两侧边界:只有左右都满足边界,这个关键字才删;否则当普通名字留下。
- 语法不用再查:输入已经保证大体合法,不必另做语法检查。
- 可以放心简化:关键字那一句里(跨不跨行都一样)不会夹注释;引号中间也不会再嵌套关键字。例如不用处理 // ,也不用处理 " ";。