У меня есть 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 ...

2 ответа2

0

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

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

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

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

0

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .