用于匹配多目标搜索的正则表达式
RegEx for matching multiple target search
我使用的是最新最好的 Notepad++。我有 1,500 XML 个文件。我的目标是按组组织所有 1,500 XML 个文件。有人可以帮我开发一个 RegX,让我可以在所有 1,500 个 XML 文件中搜索多个 XML 标签类型。
因此,例如,我希望 Notepad++ 搜索我在这两个 XML 标签中嵌入了多少 XML 个文件:<tag1>
和 <tag2>
。我遇到的问题是它只能通过定位单个标签来工作。我想通过能够搜索 2、3 或 4 个标签来加强它,这将帮助我将所有 1,500 XML 个文件分组到不同的类别下。
您可以执行多种操作来查找特定的标记、属性和值。
针对您的具体情况,找到多个已知标签并匹配其余标签
标签结构就是这样:
<(tag1|tag2)(?!\w)(?:"[\S\s]*?"|'[\S\s]*?'|[^>]*?)+>
# Open or self contained tags
<
( tag1 | tag2 ) # (1), Add tags here
(?! \w )
(?: " [\S\s]*? " | ' [\S\s]*? ' | [^>]*? )+
>
但是,如果您想跟踪任何具有该名称的标签,您需要
也跟踪结束标签。
您可以将打开、关闭和 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)
)
您需要它有多可靠?这里有一个问题,因为有 1500 个输入文件,您将无法手动检查结果。所以它只需要一个流氓文件做一些合法但意外的事情(例如,写 <tag1 >
而不是 <tag1>
,或者有一个 <tag1>
的实例已经 "commented out")给你带来你不会察觉的坏结果。这对你有多重要?
这就是为什么通常建议不要使用正则表达式来处理 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()
是一个 user-written 函数,它使用 XPath 逻辑为每个文档分配一个类别,而 my:output-file-name()
是一个 user-written 函数,它决定放置的位置每个类别中的文档。
我使用的是最新最好的 Notepad++。我有 1,500 XML 个文件。我的目标是按组组织所有 1,500 XML 个文件。有人可以帮我开发一个 RegX,让我可以在所有 1,500 个 XML 文件中搜索多个 XML 标签类型。
因此,例如,我希望 Notepad++ 搜索我在这两个 XML 标签中嵌入了多少 XML 个文件:<tag1>
和 <tag2>
。我遇到的问题是它只能通过定位单个标签来工作。我想通过能够搜索 2、3 或 4 个标签来加强它,这将帮助我将所有 1,500 XML 个文件分组到不同的类别下。
您可以执行多种操作来查找特定的标记、属性和值。
针对您的具体情况,找到多个已知标签并匹配其余标签
标签结构就是这样:
<(tag1|tag2)(?!\w)(?:"[\S\s]*?"|'[\S\s]*?'|[^>]*?)+>
# Open or self contained tags
<
( tag1 | tag2 ) # (1), Add tags here
(?! \w )
(?: " [\S\s]*? " | ' [\S\s]*? ' | [^>]*? )+
>
但是,如果您想跟踪任何具有该名称的标签,您需要
也跟踪结束标签。
您可以将打开、关闭和 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)
)
您需要它有多可靠?这里有一个问题,因为有 1500 个输入文件,您将无法手动检查结果。所以它只需要一个流氓文件做一些合法但意外的事情(例如,写 <tag1 >
而不是 <tag1>
,或者有一个 <tag1>
的实例已经 "commented out")给你带来你不会察觉的坏结果。这对你有多重要?
这就是为什么通常建议不要使用正则表达式来处理 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()
是一个 user-written 函数,它使用 XPath 逻辑为每个文档分配一个类别,而 my:output-file-name()
是一个 user-written 函数,它决定放置的位置每个类别中的文档。