Блокнот ++ и xml - замена <div class="body"> <p>У меня есть XML-файл (1000 записей, упрощенный здесь), структура (например, скажем):</p> <pre><code>&lt;LIST&gt; &lt;ITEM_0&gt; &lt;NAME&gt;Item Name&lt;/NAME&gt; &lt;/ITEM_0&gt; ... &lt;ITEM_9999&gt; &lt;NAME&gt;Item Name&lt;/NAME&gt; &lt;/ITEM_9999&gt; &lt;/LIST&gt; </code></pre> <p>Мне нужен результат:</p> <pre><code>&lt;LIST&gt; &lt;ITEM&gt; &lt;ID&gt;0&lt;/ID&gt; &lt;NAME&gt;Item Name&lt;/NAME&gt; &lt;/ITEM&gt; ... &lt;ITEM&gt; &lt;ID&gt;9999&lt;/ID&gt; &lt;NAME&gt;Item Name&lt;/NAME&gt; &lt;/ITEM&gt; &lt;/LIST&gt; </code></pre> <p>Используя Regex:</p> <pre><code>Find: \&lt;ITEM_(.*)(&gt;) Replace: ITEM&gt;\n&lt;ID&gt;\1\&lt;/ID&gt; </code></pre> <p>Я получил:</p> <pre><code>&lt;LIST&gt; &lt;ITEM&gt; &lt;ID&gt;0&lt;/ID&gt; &lt;NAME&gt;Item Name&lt;/NAME&gt; &lt;/ITEM&gt; &lt;ID&gt;0&lt;/ID&gt; &lt;-- This line not wanted ... &lt;ITEM&gt; &lt;ID&gt;9999&lt;/ID&gt; &lt;NAME&gt;Item Name&lt;/NAME&gt; &lt;/ITEM&gt; &lt;ID&gt;9999&lt;/ID&gt; &lt;-- This line not wanted &lt;/LIST&gt; </code></pre> <p>Это замена <code>&lt;/ITEM&gt;</code> <strong>и</strong> даже хотя (я думаю) , я прошу его только заменить <code>&lt;ITEM&gt;</code>- то , что я делаю неправильно / как исправить? Возможно, я что-то упускаю из-за группировки (или «жадности»?), Но не уверен, что и искал подобное. Есть миллион способов порезать и нарезать это чем-то другим, но это просто мешает мне подобраться так близко, но не с АЭС.</p> <p>Помощь оценена - спасибо.</p> <p><strong>Позднее редактирование:</strong> даже если я получу первую замену для правильной работы, только <code>&lt;ITEM_#&gt;</code>тег, у меня все еще останется <code>&lt;/ITEM_#&gt;</code>закрывающий тег как еще одна операция поиска / замены. Проблема здесь текущая операция заменяет <strong>как</strong><code>&lt;ITEM</code> и <code>&lt;/ITEM</code>теги ...</p> </div>

1854
Catch21

У меня есть XML-файл (1000 записей, упрощенный здесь), структура (например, скажем):

<LIST> <ITEM_0> <NAME>Item Name</NAME> </ITEM_0> ... <ITEM_9999> <NAME>Item Name</NAME> </ITEM_9999> </LIST> 

Мне нужен результат:

<LIST> <ITEM> <ID>0</ID> <NAME>Item Name</NAME> </ITEM> ... <ITEM> <ID>9999</ID> <NAME>Item Name</NAME> </ITEM> </LIST> 

Используя Regex:

Find: \<ITEM_(.*)(>) Replace: ITEM>\n<ID>\1\</ID> 

Я получил:

<LIST> <ITEM> <ID>0</ID> <NAME>Item Name</NAME> </ITEM> <ID>0</ID> <-- This line not wanted ... <ITEM> <ID>9999</ID> <NAME>Item Name</NAME> </ITEM> <ID>9999</ID> <-- This line not wanted </LIST> 

Это замена </ITEM> и даже хотя (я думаю), я прошу его только заменить <ITEM>- то, что я делаю неправильно / как исправить? Возможно, я что-то упускаю из-за группировки (или «жадности»?), Но не уверен, что и искал подобное. Есть миллион способов порезать и нарезать это чем-то другим, но это просто мешает мне подобраться так близко, но не с АЭС.

Помощь оценена - спасибо.

Позднее редактирование: даже если я получу первую замену для правильной работы, только <ITEM_#>тег, у меня все еще останется </ITEM_#>закрывающий тег как еще одна операция поиска / замены. Проблема здесь текущая операция заменяет как<ITEM и </ITEMтеги ...

0
Почему бы не сделать обычную замену и заменить ` Blerg 7 лет назад 0
Да, спасибо, будет работать, но потребуется 2 замены, тогда как x2 поиск / замена в 1 решении регулярных выражений ниже работает нормально (но с Q там все еще не выполнено). Catch21 7 лет назад 0

2 ответа на вопрос

0
grawity

Да, вполне вероятно, что .*он слишком «жадный» и захватывает столько символов, сколько может; вам нужно обратное - вместо этого нужно максимально короткое совпадение.

[^>]*Вместо этого можно использовать один метод - он все равно будет соответствовать как можно большему числу, но только до первого >, поэтому <ITEM_([^>]*)>будет соответствовать только открывающий тег и ничего более.

В зависимости от синтаксиса регулярных выражений, .*?может также работать - это явно переключает на *«не жадный».

0
Catch21

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

Попытка следующих работ:

Find: </ITEM_.*(>)|<ITEM_(.*)(>) Replace: (?1</ITEM>)(?2<ITEM>\n<ID>\2</ID>) RegEx 

| разделяет 2 искомые строки, и? 1 и? 2 являются их соответствующими заменами.

Но </ITEMсначала я должен искать закрывающий тег, а не <ITEMтег, как вы могли бы логически представить. Итак, у меня есть решение, но может ли кто-нибудь ответить на вопрос о том, почему вышеприведенное работает, но следующее, <ITEMсначала ищущий тег, дает сбой, когда мы просто меняем порядок, в котором мы смотрим?

Find: <ITEM_(.*)(>)|</ITEM_.*(>) Replace: (?1<ITEM>\n<ID>\1</ID>)(?2</ITEM> RegEx 

Не обязательно, но пытливые умы могут захотеть узнать. Благодарю.

Похожие вопросы