我有几个大型 XML 文件,其中包含以下内容:
<TERM>
<ACTION>ADD</ACTION>
<TERM_CODE>1</TERM_CODE>
<ALTERNATIVE_REPORT_CARD_FLAG>F</ALTERNATIVE_REPORT_CARD_FLAG>
<DAYS_ABSENT>3</DAYS_ABSENT>
<TIMES_LATE>2</TIMES_LATE>
</TERM>
但也包含类似的块,例如:
<TERM>
<ACTION>ADD</ACTION>
<TERM_CODE>2</TERM_CODE>
<ALTERNATIVE_REPORT_CARD_FLAG>F</ALTERNATIVE_REPORT_CARD_FLAG>
<DAYS_ABSENT>12</DAYS_ABSENT>
<TIMES_LATE>0</TIMES_LATE>
<SUBJECT_STRAND>
<ACTION>ADD</ACTION>
<SUBJECT_STRAND_CODE>ART-20</SUBJECT_STRAND_CODE>
</SUBJECT_STRAND>
<LEARNING_SKILL>
<ACTION>ADD</ACTION>
<LEARNING_SKILL_CODE>CL</LEARNING_SKILL_CODE>
<LEVEL>ES</LEVEL>
</LEARNING_SKILL>
</TERM>
我想删除所有不包含该<SUBJECT_STRAND>
孩子的块。
使用 Notepad++ 中的 S/R 函数,当文件中只有上述每个块中的一个时,这似乎有效,但当同时存在多个实例时,就会失败:
<TERM>.*?</TIMES_LATE>\R[^<SUBJECT_STRAND>]+</TERM>\R
任何帮助将不胜感激!
答案1
- Ctrl+H
- 找什么:
<TERM>(?:(?!<SUBJECT_STRAND>).)*?</TERM>
- 用。。。来代替:
LEAVE EMPTY
- 检查匹配大小写
- 检查环绕
- 检查正则表达式
- 查看
. matches newline
- Replace all
解释:
<TERM> # literally
# Tempered Greedy Token:
(?: # start non capture group
(?! # start negative lookahead, make sure we haven't:
<SUBJECT_STRAND> # literally
) # end lookahead
. # any character
)*? # end group, may appear 0 or more times, not greedy
</TERM> # literally
屏幕截图(之前):
屏幕截图(之后):