正则表达式搜索包含其他短语的短语并且不标记任何其他内容

Regexp to search for phrase containing other phrase and don't mark anything other

类似的主题经常出现在这里,但即使分析它们我仍然无法找到正确的正则表达式来完成我的任务。我有一个包含某些部分的 XML 文件。我需要删除包含给定属性的文本部分并保留其他所有内容。

示例文本部分:

<Text FontFamily="Open Sans" FontSize="19" FontStyle="Normal"
    FontWeight="Normal" HorizontalAlign="Left" Left="803.0"
    Name="Back" Stroke="#CCCCCC" TextDecoration="None"
    Top="126.0" Visibility="Hidden">
... More content here ...
</Text>

我只需要查找并删除包含 Name="Back" 的那些。其他文本部分中有不同的 Name 属性,或者有些部分根本没有 Name(未命名)。部分是多行的。

最简单的正则表达式是:

(?s)<Text (.*?)Name="Back"(.*?)</Text>

也是一个不合适的。如果 Name="Back" 出现,则正则表达式标记正确的部分。但是如果没有这个特殊的短语,那么它从 <Text> 然后标记许多其他文本或不标记文本部分,直到找到 </Text> 后跟 Name="Back" 可以在文件末尾。所以它几乎标记了整个文件,许多文本而不是文本部分。

没有必要展示我尝试根据其他人的正则表达式解决方案创建的其他正则表达式试验。最终的正则表达式什么都不标记或标记太多。

我将不胜感激。

顺便说一句,我如何在此处转义<<加上Text不会出现在正文中,只会出现在代码段中。

你很接近,试试这个:

(?s)<Text[^>]*? Name="Back".*?>.*?<\/Text>

https://regex101.com/r/Dmyq59/1

查看演示

^ 我知道这不是 Notepad++ 但它们都是 PCRE


如果您将正则表达式粘贴到我的 regex101 示例中,那么它将为您可视化问题,即 Text (.*?)Name="Back" 因为 (.*?) 将继续捕获所有内容,直到它到达包含 [=13] 的标签=]


您应该强烈考虑安装 XPatherizerNPP 插件,以便您可以使用 XPath。等效的 XPath 应该是 //text[@name='Back']