首页 > 解决方案 > 正则表达式搜索包含其他短语的短语并且不标记其他任何内容

问题描述

类似的主题经常出现在这里,但即使分析它们,我仍然无法找到合适的正则表达式来完成我的任务。我有一个包含一些部分的 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>then 开始标记许多其他文本或非文本部分,直到找到 </Text>后面的Name="Back"可以在文件末尾。所以它几乎标记了整个文件,许多文本而不是文本部分。

展示我尝试基于其他人的正则表达式解决方案创建的其他正则表达式试验是没有意义的。最后的正则表达式没有标记或标记太多。

我将不胜感激。

对了,我怎么逃到<这里?<加号Text不会出现在文本中,只会出现在代码段中。

标签: regexnotepad++

解决方案


你很接近,试试这个:

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

请参阅https://regex101.com/r/Dmyq59/1上的演示

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


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


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


推荐阅读