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

时间:2019-05-21 21:40:51

标签: regex xml notepad++ regex-lookarounds regex-greedy

我正在使用最新最好的Notepad ++。我有1,500个XML文件。我的目标是按组组织所有1,500个XML文件。有人可以帮我开发RegX,让我在所有1,500个XML文件中搜索多种XML标记类型。

因此,例如,我希望Notepad ++搜索两个<tag1><tag2>这两个XML标记中嵌入了多少XML文件。我遇到的问题是,它只能通过定位单个标签来工​​作。我想通过搜索2、3或4个标签来加强它,这将有助于我将所有1,500个XML文件归为不同类别。

2 个答案:

答案 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()是一个用户编写的函数,用于确定将文档放置在每个类别中的位置。