用于匹配多目标搜索的正则表达式

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 函数,它决定放置的位置每个类别中的文档。