RegEx для поиска нескольких целей - PullRequest
0 голосов
/ 22 мая 2019

Я использую последний и лучший Блокнот ++.У меня 1500 файлов XML.Моя цель - организовать все 1500 файлов XML по группам.Может кто-нибудь помочь мне разработать RegX, который позволит мне искать несколько типов тегов XML во всех 1500 XML-файлах.

Так, например, я хочу, чтобы Notepad ++ искал меня, сколько файлов XML встроено в эти два тега XML: <tag1> & <tag2>.Проблема, с которой я столкнулся, заключается в том, что она работает только с одним тегом.Я хотел бы повысить его, имея возможность искать 2, 3 или 4 тега, и это поможет мне сгруппировать все 1500 файлов XML по различным категориям.

Ответы [ 2 ]

1 голос
/ 22 мая 2019

Есть много вещей, которые вы можете сделать, чтобы найти определенные теги, атрибуты и значения.

Для вашего конкретного случая, чтобы найти несколько известных тегов и сопоставить с остальными
структура тега это просто так:

<(tag1|tag2)(?!\w)(?:"[\S\s]*?"|'[\S\s]*?'|[^>]*?)+>

 # Open or self contained tags
 <
 ( tag1 | tag2 )               # (1), Add tags here
 (?! \w )
 (?: " [\S\s]*? " | ' [\S\s]*? ' | [^>]*? )+
 >

Однако, если вы хотите отследить какой-либо тег с таким именем, вам нужно будет
отслеживать закрывающие теги.

Вы можете комбинировать открытие, закрытие и автономность с помощью этого регулярного выражения:

<(?:((?&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)
 )
0 голосов
/ 22 мая 2019

Насколько надежным оно должно быть?Здесь проблема в том, что при 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() - это пользовательская функция, которая решает, куда поместить документы в каждой категории.

...