我正在使用最新最好的Notepad ++。我有1,500个XML文件。我的目标是按组组织所有1,500个XML文件。有人可以帮我开发RegX,让我在所有1,500个XML文件中搜索多种XML标记类型。
因此,例如,我希望Notepad ++搜索两个<tag1>
和<tag2>
这两个XML标记中嵌入了多少XML文件。我遇到的问题是,它只能通过定位单个标签来工作。我想通过搜索2、3或4个标签来加强它,这将有助于我将所有1,500个XML文件归为不同类别。
答案 0 :(得分:1)
您可以执行许多操作来查找特定的标签,属性和值。
针对您的特定情况,查找多个已知标签并与其余标签匹配
标记结构就是这样:
<(tag1|tag2)(?!\w)(?:"[\S\s]*?"|'[\S\s]*?'|[^>]*?)+>
# Open or self contained tags
<
( tag1 | tag2 ) # (1), Add tags here
(?! \w )
(?: " [\S\s]*? " | ' [\S\s]*? ' | [^>]*? )+
>
但是,如果您要跟踪具有该名称的任何标签,则需要
以及跟踪结束标签。
您可以将此正则表达式与open,close和self-contained相结合:
<(?:((?&tag_names))(?!\w)(?:"[\S\s]*?"|'[\S\s]*?'|[^>]*?)+|\/((?&tag_names))\s*)>(?(DEFINE)(?<tag_names>tag1|tag2))
https://regex101.com/r/QdZL6B/1
而且,您可以根据匹配的组来区分哪个。
扩展
<
(?:
( (?&tag_names) ) # (1), Open or self contained tags
(?! \w )
(?: " [\S\s]*? " | ' [\S\s]*? ' | [^>]*? )+
|
\/
( (?&tag_names) ) # (2), Close tags
\s*
)
>
(?(DEFINE)
(?<tag_names> # (3 start)
tag1 # Add all your tags here
| tag2
) # (3 end)
)
答案 1 :(得分:0)
您需要多可靠?这里存在一个问题,因为有1500个输入文件,您将无法手动检查结果。因此,它只需要一个恶意文件来执行合法但出乎意料的操作(例如,写入<tag1 >
而不是<tag1>
,或者具有已经被“注释掉”的<tag1>
实例)给您带来无法检测到的不良结果。这对您有多重要?
这就是为什么通常建议不要使用正则表达式来处理XML,而总是建议使用XML解析器和XML查询语言(例如XPath)。
XSLT 2.0+和XQuery都使您能够处理XML文件的集合。您尚未给出非常精确的需求说明,但是您可以执行以下操作:
<xsl:for-each-group select="collection('file:///Users/me/data/')"
group-by="my:category(.)">
<xsl:for-each select="current-group()">
<xsl:result-document href="{my:output-file-name(current-grouping-key())}">
<xsl:copy-of select="."/>
</
</
</
其中my:category()
是一个用户编写的函数,它使用XPath逻辑为每个文档分配一个类别,而my:output-file-name()
是一个用户编写的函数,用于确定将文档放置在每个类别中的位置。